uuencodingはバイナリからテキストへのエンコードの一種で、1980年にカリフォルニア大学バークレー校のメアリー・アン・ホートンによって書かれたUnixプログラムuuencodeとuudecodeに由来し、 [ 1 ]電子メールシステムで送信するためのバイナリデータをエンコードするために使用されます。
「uuencoding」という名前は、Unix-to-Unix Copyに由来します。つまり、「Unix-to-Unix encoding」は、任意のファイルをあるUnixシステムから別のUnixシステムに転送するための安全なエンコード方式ですが、中間のリンクがすべてUnixシステムである保証はありません。電子メールメッセージは、異なる文字セットを持つコンピュータや、 8ビットクリーンではないトランスポートを介して転送されるか、8ビットクリーンではないプログラムによって処理される可能性があるため、バイナリファイルを電子メールで転送すると、ファイルが破損する可能性があります。このようなデータをほとんどの文字セットに共通する文字サブセットにエンコードすることで、エンコードされたデータファイルは「変換」または破損する可能性が低くなり、送信先にはそのままの形で届きます。プログラムuudecode はuuencodeの効果を逆転させ、元のバイナリファイルを正確に再現します。uuencode/decode は、バイナリファイル(特に圧縮ファイル)を電子メールで送信したり、 Usenetニュースグループ に投稿したりするために広く利用されました。
現在では、 MIMEとyEncに大きく置き換えられています。MIMEでは、uuencodeされていた可能性のあるファイルはBase64エンコードで転送されます。
エンコードされた形式
uuencode されたファイルは、次の形式のヘッダー行で始まります。
begin <モード> <ファイル><改行>
<mode>ファイルのUnixファイルパーミッションを3桁の8進数で表します(例:644、744)。これは通常、Unix系オペレーティングシステムでのみ意味を持ちます。
<file>バイナリ データを再作成するときに使用するファイル名です。
<newline>各行を終了するために使用される 改行文字を表します。
各データ行は次の形式を使用します。
<文字長><フォーマットされた文字><改行>
<length character>その行にエンコードされたデータバイト数を示す文字です。これは実際のバイト数に32を加算することで決定されるASCII文字です。ただし、ゼロバイトを表す重アクセント「`」(ASCIIコード96)は例外です。最後の行(データ長が45で割り切れない場合)を除くすべてのデータ行は、45バイトのエンコードされたデータ(エンコード後60文字)で構成されます。したがって、長さの値の大部分は「M」(32 + 45 = ASCIIコード77、つまり「M」)です。
<formatted characters>エンコードされた文字です。実際の実装の詳細については、 § フォーマットメカニズムを参照してください。
ファイルは次の 2 行で終わります。
`<改行> 終了<改行>
最後から 2 番目の行も行の長さを示す文字であり、アクサングラーブは 0 バイトを表します。
完全なファイルとして、 Catという文字だけを含むcat.txtというプレーンテキストファイルのUUエンコード出力は次のようになります。
644 cat.txt の開始 #0V%T ` 終わり
開始行は標準の uuencode ヘッダーです。「#」は、その行が 3 つの文字をエンコードすることを示します。最後の 2 行は、すべての uuencode ファイルの最後に表示されます。
フォーマットメカニズム
のメカニズムはuuencoding、3 バイトごとに次の処理を繰り返し、4 つの印刷可能な文字にエンコードします。各文字は、基数 64の数字を表します。
- ソースから3バイト(合計24ビット)から開始します。
- 4 つの 6 ビット グループに分割され、各グループは 0 ~ 63 の範囲の値を表します (ビット (00 ~ 05)、(06 ~ 11)、(12 ~ 17)、(18 ~ 23))。
- それぞれの値に32を加算します。32を加算すると、結果は32(" "スペース)から95("_"アンダーライン)までの範囲になります。96("`"アクサン)を「特殊文字」とみなすのは、この範囲の論理的な拡張です。スペース文字は0のエンコードとして文書化されていますが、GNU sharutils [ 2 ]などの実装では、実際にはファイル本体のゼロもアクサン文字でエンコードしており、スペースは使用しません。
- これらの数字に相当する ASCII を出力します。
ソースの長さが3で割り切れない場合、最後の4バイトセクションには、3で割り切れるようにパディングバイトが含まれます。これらのバイトは行の長さから差し引かれる<length character>ため、デコーダーはファイルに不要な文字を追加しません。
uudecoding上記の逆で、各文字の ASCII コードから 32 を減算して (重アクセントの使用を考慮して 64を法として) 6 ビット値を取得し、4 つの 6 ビット グループを連結して 24 ビットを取得し、3 バイトを出力します。
この表は、エンコードのプロセスを示しています。この表は、「Cat」に対する上記のエンコードの導出を示しています。
| オリジナルキャラクター | C | a | t | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 元のASCII、10進数 | 67 | 97 | 116 | |||||||||||||||||||||
| ASCII、バイナリ | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
| 新しい小数値 | 16 | 54 | 5 | 52 | ||||||||||||||||||||
| +32 | 48 | 86 | 37 | 84 | ||||||||||||||||||||
| uuencoded文字 | 0 | V | % | T | ||||||||||||||||||||
uuencodeテーブル
次の表は、変換プロセス中に取得された 6 ビット フィールドの 10 進数値と、それに対応する ASCII 文字出力コードおよび文字の変換を示しています。
一部のエンコーダーはアクサングラーブ ("`"、コード 96) の代わりにスペース (コード 32) を生成する可能性があり、一部のデコーダーはスペースを含むデータのデコードを拒否する可能性があることに注意してください。
| ビット | ASCIIコード | ASCII文字 | ビット | ASCIIコード | ASCII文字 | ビット | ASCIIコード | ASCII文字 | ビット | ASCIIコード | ASCII文字 | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 00 | 96 | ` | 16 | 48 | 0 | 32 | 64 | @ | 48 | 80 | P | |||
| 01 | 33 | ! | 17 | 49 | 1 | 33 | 65 | A | 49 | 81 | Q | |||
| 02 | 34 | " | 18 | 50 | 2 | 34 | 66 | B | 50 | 82 | R | |||
| 03 | 35 | # | 19 | 51 | 3 | 35 | 67 | C | 51 | 83 | S | |||
| 04 | 36 | $ | 20 | 52 | 4 | 36 | 68 | D | 52 | 84 | T | |||
| 05 | 37 | % | 21 | 53 | 5 | 37 | 69 | E | 53 | 85 | U | |||
| 06 | 38 | & | 22 | 54 | 6 | 38 | 70 | F | 54 | 86 | V | |||
| 07 | 39 | ' | 23 | 55 | 7 | 39 | 71 | G | 55 | 87 | W | |||
| 08 | 40 | ( | 24 | 56 | 8 | 40 | 72 | H | 56 | 88 | X | |||
| 09 | 41 | ) | 25 | 57 | 9 | 41 | 73 | I | 57 | 89 | Y | |||
| 10 | 42 | * | 26 | 58 | : | 42 | 74 | J | 58 | 90 | Z | |||
| 11 | 43 | + | 27 | 59 | ; | 43 | 75 | K | 59 | 91 | [ | |||
| 12 | 44 | , | 28 | 60 | < | 44 | 76 | L | 60 | 92 | \ | |||
| 13 | 45 | - | 29 | 61 | = | 45 | 77 | M | 61 | 93 | ] | |||
| 14 | 46 | . | 30 | 62 | > | 46 | 78 | N | 62 | 94 | ^ | |||
| 15 | 47 | / | 31 | 63 | ? | 47 | 79 | O | 63 | 95 | _ |
例
以下は、1行のテキストファイルをuuencodeする例です。この例では、%0Dはキャリッジリターンのバイト表現、%0Aはラインフィードのバイト表現です。
- ファイル
ファイル名 = wikipedia-url.txt ファイルの内容 = http://www.wikipedia.org%0D%0A
- uuエンコーディング
開始 644 wikipedia-url.txt ::'1T<#HO+W=W=RYW:6MI<&5D:6$N;W)G#0H` ` 終わり
フォーク(ファイル、リソース)
Unix は伝統的に、ファイルデータが格納される単一のフォークを持っています。ただし、一部のファイルシステムでは、単一のファイルに関連付けられた複数のフォークをサポートしています。たとえば、古典的な Mac OS階層ファイルシステム(HFS) は、データフォークとリソースフォークをサポートしていました。Mac OS HFS+ は、Microsoft Windows NTFS代替データストリームと同様に、複数のフォークをサポートしています。ほとんどの uucoding ツールは、プライマリデータフォークのデータのみを処理するため、エンコード/デコード時に情報が失われる可能性があります (たとえば、Windows NTFS ファイルのコメントは別のフォークに保存されます)。一部のツール (古典的な Mac OS アプリケーションUUToolなど) は、異なるフォークを 1 つのファイルに連結し、ファイル名で区別することでこの問題を解決しました。
xxencode、Base64、Ascii85との関係
uuencodeされたデータは、文字範囲が限られているにもかかわらず、EBCDICなどの非ASCII文字セットを使用する特定のコンピュータを通過する際に破損することがあります。この問題を解決するための試みの一つとして、英数字とプラス記号とマイナス記号のみを使用するxxencode形式が挙げられます。今日ではBase64形式がより一般的で、 ASCII 32~95ではなく英数字のみを使用するという同じ概念に基づいています。これら3つの形式はすべて、入力データを6ビット(64の異なる文字)で表現します。
Base64 も uuencode プログラムによって生成することができ、実際の文字の変換を除いて形式は似ています。
ヘッダーは次のように変更されます
begin-base64 <モード> <ファイル>
トレーラーは
====
行間は以下から選択された文字でエンコードされます
ABCDEFGHIJKLMNOP QRSTUVWXYZabcdef ghijklmnopqrstuv wxyz0123456789+/
もう一つの選択肢はAscii85で、これは4つのバイナリ文字を5つのASCII文字にエンコードします。Ascii85 はPostScriptおよびPDF形式で使用されます。
デメリット
uuencoding は、フォーマット済みの3バイトを4バイトに変換し、開始/終了タグ、ファイル名、区切り文字を追加します。これにより、ソースのみの場合と比較して少なくとも33%のデータオーバーヘッドが発生しますが、uuencoding 前にファイルを圧縮することで、ある程度は補償できます。
言語サポート
パイソン
Python言語は、コーデック "uu" を指定した codecs モジュールを使用した uuencoding をサポートしています。
Python 2 の場合(2020 年 1 月 1 日時点で非推奨/廃止):
$ python -c 'print "Cat".encode("uu")' begin 666 <データ> # 0V%T end$Python 3 の場合、codecs モジュールをインポートして直接使用する必要があります。
$ python3 -c "from codecs import encode;print(encode(b'Cat', 'uu'))" b'begin 666 <data>\n#0V%T\n \nend\n' $デコードするには、ファイル全体を渡します。
$ python3 -c "from codecs import decode;print(decode(b'begin 666 <data>\n#0V%T\n \nend\n', 'uu'))" b'Cat'パール
Perl言語は、フォーマット文字列 "u" を指定した pack() および unpack() 演算子を使用して、uuencoding をネイティブにサポートします。
$ perl -e 'print pack("u","Cat")' # 0V%T unpack を使用した base64 のデコードは、同様に文字を変換することによって実行できます。
$ perl -e 'print unpack("u","#0V%T")'猫整形式のUUエンコードファイルを生成するには、モジュール[ 3 ]、またはもう少しのコードを使用する必要があります: [ 4 ]
エンコード(ワンライナー)
$ perl -ple 'BEGIN{use File::Basename;$/=undef;$sn=basename($ARGV[0]);} $_= "begin 600 $sn\n".(pack "u", $_)."`\nend" if $_' /some/file/to_encode.gz PHP
PHP言語にはネイティブの convert_uuencode() 関数があります。
$ php -r "echo convert_uuencode('Cat');" # 0V%T `デコードは対応する convert_uudecode() 関数で実行されます。
$ php -r "echo convert_uudecode('#0V%T');"猫参照
- さまざまなエンコードアルゴリズムの比較のためのバイナリからテキストへのエンコード
参考文献
- ^ Horton, Mark. 「UUENCODE(1C) UNIXプログラマーズ・マニュアル」 . The Unix Heritage Society . 2020年11月10日閲覧。
- ^ "uuencode.c ソース" . fossies.org . 2021年6月5日閲覧。
- ^ "PerlPowerTools ソース" . metacpan.org . 2024年2月12日閲覧。
- ^ "uuencode.pl ソース" . main.linuxfocus.org . 2024年2月12日閲覧。
外部リンク
- POSIX.1-2008のuuencodeエントリ
- GNU-sharutils – オープンソースの shar/unshar/uuencode/uudecode ユーティリティ スイート
- UUDeview – Unix/Windows/DOS で Base64、BinHex、uuencode、xxencode などをエンコード/デコードするオープンソース プログラム
- UUENCODE-UUDECODE – Clem "Grandad" Dye が作成したエンコード/デコード用のオープンソース プログラム
- StUU – Stuart CheshireによるMacintosh用オープンソース高速UUDecoder
- UUENCODE-UUDECODE – 無料のオンラインUUEncoderとUUDecoder
- Java UUDecoder – UUエンコードされた(メール)添付ファイルをデコードするためのオープンソースJavaライブラリ
- AN11229 – NXP アプリケーションノート: UART ISP の UUencoding