#?SuikaWiki/0.9 page-icon="字β" [5] オクテット値を64文字の英数字などにする encode です。 早い話がオクテット列の64進数表記です。 [[MIME]] [[RFC]] (最新版は RFC 2045 ) で定義されていますが、元々は [[PEM]] (RFC 1421 ) で規定されていました。 オクテット値3つ (8ビット×3 = 24ビット) を4文字 (6ビット×4) で表現します。ですからデータ量は3分の4倍、33%増加になります。 64文字 (と、特殊用途に使われる「=」) は、 [[ISO/IEC 646]] の版で 全て共通に存在し、しかも [[EBCDIC]] の全ての版で使える文字 から選ばれたようです。 Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y Base64 は6ビット単位になりますが、オクテット列の長さと必ずしも 一致する (6と8の公倍数の長さになる) とは限らないので、 「=」で埋めて調節します。この結果、 Base64 data は必ず 4の整数倍の長さになります。 Base64'ed data は、 MIME の制限上、一行辺り76文字以下 でなければなりません。区切りの改行文字列 CRLF は、 復号の時には無視されます。 (これ以外でも、上の表に無い 文字が現れたら、無視して処理を続けます。) 詳しくは RFC 2045 を読んで下さい。 RFC 2047 は、 encoded-word で使われる B 符号化を、 Base64 と全く同じ物であるとしています。 *応用 [6] PEM/MIME の定義と全く同じ Base64 を使っている主な応用: -[[PEM]]の署名 -[[MIME]]の[[転送符号化]] -x-gzip64 [[転送符号化]] (See [[Content-Transfer-Encoding:欄]]) -[[Content-MD5:欄]] -[[data:URL]] -[[PGP/MIME]] **uuencode みたいの [3] [[MIME]] 以外の場面でファイルを貼り付けるのに、 [[uuencode]] みたいな書き方をすることがあるみたい。 begin-base64 644 base64ed.data ... base64 stream ... ==== *変種 [1] データ長がある程度決まっている場合は、 "=" padding が無駄であることがあります。この場合で、 "=" padding を省略する と規定しているものがあります。 [2] 必ず[[8ビット・バイト]]を使用するものは、 "=" padding の代わりに、元のデータの後に任意個の 0x00 が並んでいる としても解釈上影響がないことがあります。そういうものがあります。 -[[UTF-7]] [7] 修正 [[UTF-7]] では、 >>2 の修正に加えて、 "/" の代わりに "," が使われています。 [9] [CODE(URN)[urn-5]] [[URN]] [[名前空間]]で使っている Base64 変種は、 [CODE(Base64)[/]] の代わりに [CODE(URN)[-]] を使います。 (URN では [CODE(URI)[/]] が使えないため。) また、詰め文字は使いません。 (''Namespace ID: urn-5'' ) - [14] 変種ではありませんが、 [[MIME]] の [[application/octet-stream]] では、[[オクテット]] (8[[ビット]]) でないビット列も扱うことが出来ます。そのような場合には全体長が8の倍数になるようにビット [CODE[0]] を詰め、詰めた数をパラメーターでメモっておきます。 - [16] [[RFC3548]] 曰く、 MIME Base64 ではファイル名や [[URI]] で安全ではないので、 [CODE[/]] の代わりに [CODE[~]] を使う提案があったそうです。しかし [CODE[~]] もやはりファイル・システムや URI で安全とは言えません。 - [17] そこで 3548 はファイル名や URI で暗然な代替 Base64 字母として、 [CODE[+]] と [CODE[/]] に代えて [CODE[-]] と [CODE[_]] を使うものを規定しています。それでも [CODE(URI)[=]] が padding に使われてるので、まだ完全に URI で安全とは言えません。 [CODE[-]] が先頭に来る可能性があるので [[Un|x]] で安全でない虞もあります。 - [18] [[M$XML]] は [CODE(char)[/]] の代わりに [CODE(char)[*]] を使っていたそうです。最近の版では両方認識するそうです。 [[#comment]] *実装 [4] [[Perl]] なら、 [[MIME::Base64]] を使うのが気楽かと。 perl 5.8.0 では標準で入っています。 但し、 >>1,>>2,>>7 のような変種には対応していません。 [8] [[uuencode]] も64進数であることを利用して、 uuencode で符号化した後に [[tr]] を使うという方法が使われることもあります。 *メモ - [10] [[XML]] でバイナリを扱う時には Base64 を使うのが推奨されている (誰に?) そうです。 (「XML は人間可読である」のじゃなかったのか? って気もするが。) - [11] >>10 実際のところ、 [[ISO/IEC6479]] の[[制御シーケンス]]とかが混じったデータを使いたいという要求はある。 (それは XML の思想に反するという反発は強く、 XML 1.1 でも結局駄目になったけど。) - [12] [[インターネット]]でのオクテット列の文字列転写法の[[デ・ファクト標準]]です。 - [13] >>11 でも、せめて [CODE(char)[[ABBR[[[FF]]] [FORM FEED]]]] くらい使いたい気はする。 (実質 [[Un*x]] でしか使えない環境依存だから入れたくないのかもしれんが。) - [15] Base64 を規定する新しい RFC, [[RFC3548]] がでました。