Uuencode

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標準


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

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。