uuencodeとは
uuencodeは、
UNIXおよび
Unix系OSで用いられる、
バイナリデータをテキストデータに変換するためのコマンド、およびそのフォーマットです。主に、
電子メールやネットニュースで
バイナリファイルを添付する際に利用されていました。変換されたデータは、`uudecode`コマンドで元の
バイナリデータに復元できます。
歴史的背景
初期のUnix環境では、UUCP(Unix to Unix Copy)プロトコルが
電子メールやネットニュースの配送に用いられていました。これらのプロトコルはテキストデータしか扱えなかったため、
バイナリファイルを転送する手段としてuuencodeが開発されました。uuencodeは、Unix to Unix ENCODEの略称です。
インターネットが普及し、TCP/IPが主流となる中でも、
電子メールやネットニュースはSMTPやNNTPといったテキストベースのプロトコルを使用していたため、uuencodeは引き続き広く利用されました。
フォーマット
uuencodeで変換されたテキストデータは、以下の構造を持ちます。
1.
ヘッダー: 変換されたファイルのパーミッションとファイル名を指定します。
begin
ここで、``は3桁の8進数でファイルのパーミッションを表し、``はデコード後のファイル名です。
2. エンコードされたデータ: バイナリデータを変換したテキストデータが続きます。
3. フッター: エンコードされたデータの終わりを示します。
end
エンコードの仕組み
エンコードは3オクテット(24ビット)のバイナリデータを、4つの6ビット値に変換し、それぞれをASCII文字に割り当てることで行われます。6ビット値に0x20を加算した値がASCIIコードとして利用されます。変換テーブルは以下の通りです。
6ビット値 | ASCII文字 |
---|
:--: | :-: |
0x00 | ` ` |
0x01 | `!` |
0x02 | `"` |
... | ... |
0x3f | `_` |
当初、`0x00`はスペース文字でしたが、転送時に行末のスペースが削除される問題があったため、代わりに「`」が用いられるようになりました。
エンコード例
以下は、Solaris 10の`uuencode`コマンドによる出力例です。この例では、`0x00`にスペースを使用しています。
begin 644 testimg.png
MB5!.1PT&@H -24A$4@ " @" 8 !S>GKT !&=!34$ +&/
M"_QA!0 $=)1$%46$?MUK$- " (!$#FR/Y4OU<@RLBLM>S-'Q
M^^ZYH9TJ,!H%"! @0( @1CMTO<9F$4! @0(""! X+? !I?UJM5MS!;U
) $E%3D2N0F""
end
一方、GNU sharutilsの`uuencode`コマンドでは、`0x00`に「`」を使用しています。行末にスペースが現れないのが特徴です。
begin 644 testimg.png
MB5!.1PT&@H`-24A$4@"``@"`8!S>GKT`!&=!34$``+&/
M"_QA!0$=)1$%46$?MUK$-`"`(!$#FR/Y4OU<@RLBLM>S-'Q
M^^ZYH9TJ,!H%"!`@0(``@1CMTO<9F$4!`@0(""!`X+?`!I?UJM5MS!;U`
)`$E%3D2N0F""
`
end
派生フォーマット
初期の`uuencode`には、以下のような問題点がありました。
メールシステムが行末のスペースを削除する可能性がある。
転送エラーを検出できない。
ASCIIを前提としているため、EBCDICなどのシステムで問題がある。
これらの問題に対処するため、様々な派生フォーマットが生まれました。
スペース問題への対処
行末のスペース削除問題は、スペースを「`」に置き換えることで解決しました。
チェックサムの追加
転送エラーの検出のため、チェックサムを追加する派生フォーマットが登場しました。以下は、チェックサムを追加した例です。
begin 644 testimg.png
MB5!.1PT&@H`-24A$4@"``@"`8!S>GKT`!&=!34$``+&/`
M"_QA!0$=)1$%46$?MUK$-`"`(!$#FR/Y4OU<@RLBLM>S-'QR
M^^ZYH9TJ,!H%"!`@0(``@1CMTO<9F$4!`@0(""!`X+?`!I?UJM5MS!;U`!
)`$E%3D2N0F""R
``
end
size 144
xxencode
`xxencode`は、EBCDIC環境での利用を考慮して開発されました。`uuencode`とは異なり、`+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`の文字セットを使用します。`uuencode`との互換性はありません。
begin 644 testimg.png
hWJ-CFko84Uc++++BGIV2IU+++0+++++U0+M+++-nSbfo++++-4R-HI2++94D
h0zlV-E+++2R7F23IK2Thpf2B+0+6-21QTqV2rE+8amDtIjpQUmgWgh8SnB5l
hyyutcNoeA-c30-+UE6++UFXhojQNa2I-+UE620-+s9T+-dTpehJhn-Pp++++
7+2Z3HYGiEa00
+
end
POSIXでは、`uuencode`の新しいアルゴリズムとしてBase64をベースにしたフォーマットを定義しました。これにより、EBCDIC環境でも利用可能となりました。
begin-base64 644 testimg.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAEdJREFU
WEft1rENACAIBEDcf2hE3QAKmyP5Uv1cgysistKezNHx++65oZ0qMBoFCBAgQIAAgRjt0vcZmEUB
AgQIECBA4LfABpf1qtVtzBb1AAAAAElFTkSuQmCC
====
MIMEとの関係
MIMEは、電子メールでテキスト以外のデータを取り扱うための規格です。MIMEでは`uuencode`は標準のエンコーディング方式として採用されていません。しかしながら、`uuencode`をMIME環境で使用するための実装がいくつか存在します。
MIMEでのuuencodeの使用例
以下は、MIMEで`uuencode`を利用する例です。`Content-Transfer-Encoding`または`Content-Type`ヘッダで`x-uuencode`を指定します。
Content-Type: image/png; name="testimg.png"
Content-Transfer-Encoding: x-uuencode
Content-Disposition: inline; filename="testimg.png"
begin 644 testimg.png
MB5!.1PT&@H`-24A$4@"``@"`8!S>GKT`!&=!34$``+&/
M"_QA!0$=)1$%46$?MUK$-`"`(!$#FR/Y4OU<@RLBLM>S-'Q
M^^ZYH9TJ,!H%"!`@0(``@1CMTO<9F$4!`@0(""!`X+?`!I?UJM5MS!;U`
)`$E%3D2N0F""
`
end
または
Content-Type: application/x-uuencode; name="testimg.png"
Content-Disposition: attachment; filename="testimg.png"
Content-Transfer-Encoding: 7bit
begin 644 testimg.png
MB5!.1PT&@H`-24A$4@"``@"`8!S>GKT`!&=!34$``+&/
M"_QA!0$=)1$%46$?MUK$-`"`(!$#FR/Y4OU<@RLBLM>S-'Q
M^^ZYH9TJ,!H%"!`@0(``@1CMTO<9F$4!`@0(""!`X+?`!I?UJM5MS!;U`
)`$E%3D2N0F""
`
end
現在の状況
現在では、Base64がバイナリデータのテキスト変換の標準として広く利用されており、`uuencode`は過去の技術となりつつあります。しかしながら、古いシステムや環境では、依然として`uuencode`を目にする機会があるかもしれません。
参照
IEEE Std 1003.1 uuencode man page
Online UUencoder/UUdecoder
関連項目
Base64
ish
* BinHex