uuエンコーディング

uuencodingはバイナリからテキストへのエンコードの一種で、1980年にカリフォルニア大学バークレー校メアリー・アン・ホートンによって書かれたUnixプログラムuuencodeuudecodeに由来し、 [ 1 ]電子メールシステムで送信するためのバイナリデータをエンコードするために使用されます。

「uuencoding」という名前は、Unix-to-Unix Copyに由来します。つまり、「Unix-to-Unix encoding」は、任意のファイルをあるUnixシステムから別のUnixシステムに転送するための安全なエンコード方式ですが、中間のリンクがすべてUnixシステムである保証はありません。電子メールメッセージは、異なる文字セットを持つコンピュータや、 8ビットクリーンではないトランスポートを介して転送されるか、8ビットクリーンではないプログラムによって処理される可能性があるため、バイナリファイルを電子メールで転送すると、ファイルが破損する可能性があります。このようなデータをほとんどの文字セットに共通する文字サブセットにエンコードすることで、エンコードされたデータファイルは「変換」または破損する可能性が低くなり、送信先にはそのままの形で届きます。プログラムuudecode はuuencodeの効果を逆転させ、元のバイナリファイルを正確に再現します。uuencode/decode は、バイナリファイル(特に圧縮ファイル)を電子メールで送信したり、 Usenetニュースグループ に投稿したりするために広く利用されました。

現在では、 MIMEyEncに大きく置き換えられています。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の数字を表します。

  1. ソースから3バイト(合計24ビット)から開始します。
  2. 4 つの 6 ビット グループに分割され、各グループは 0 ~ 63 の範囲の値を表します (ビット (00 ~ 05)、(06 ~ 11)、(12 ~ 17)、(18 ~ 23))。
  3. それぞれの値に32を加算します。32を加算すると、結果は32(" "スペース)から95("_"アンダーライン)までの範囲になります。96("`"アクサン)を「特殊文字」とみなすのは、この範囲の論理的な拡張です。スペース文字は0のエンコードとして文書化されていますが、GNU sharutils [ 2 ]などの実装では、実際にはファイル本体のゼロもアクサン文字でエンコードしており、スペースは使用しません。
  4. これらの数字に相当する ASCII を出力します。

ソースの長さが3で割り切れない場合、最後の4バイトセクションには、3で割り切れるようにパディングバイトが含まれます。これらのバイトは行の長さから差し引かれる<length character>ため、デコーダーはファイルに不要な文字を追加しません。

uudecoding上記の逆で、各文字の ASCII コードから 32 を減算して (重アクセントの使用を考慮して 64を法として) 6 ビット値を取得し、4 つの 6 ビット グループを連結して 24 ビットを取得し、3 バイトを出力します。

この表は、エンコードのプロセスを示しています。この表は、「Cat」に対する上記のエンコードの導出を示しています。

オリジナルキャラクター Cat
元の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文字 0V%T

uuencodeテーブル

次の表は、変換プロセス中に取得された 6 ビット フィールドの 10 進数値と、それに対応する ASCII 文字出力コードおよび文字の変換を示しています。

一部のエンコーダーはアクサングラーブ ("`"、コード 96) の代わりにスペース (コード 32) を生成する可能性があり、一部のデコーダーはスペースを含むデータのデコードを拒否する可能性があることに注意してください。

ビットASCIIコードASCII文字 ビットASCIIコードASCII文字 ビットASCIIコードASCII文字 ビットASCIIコードASCII文字
0096`164803264@4880P
0133!174913365A4981Q
0234"185023466B5082R
0335#195133567C5183S
0436$205243668D5284T
0537%215353769E5385U
0638&225463870F5486V
0739'235573971G5587W
0840(245684072H5688X
0941)255794173I5789Y
1042*2658:4274J5890Z
1143+2759;4375K5991[
1244,2860<4476L6092\
1345-2961=4577M6193]
1446.3062>4678N6294^
1547/3163?4779O6395_

以下は、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');"

参照

参考文献

  1. ^ Horton, Mark. 「UUENCODE(1C) UNIXプログラマーズ・マニュアル」 . The Unix Heritage Society . 2020年11月10日閲覧。
  2. ^ "uuencode.c ソース" . fossies.org . 2021年6月5日閲覧。
  3. ^ "PerlPowerTools ソース" . metacpan.org . 2024年2月12日閲覧
  4. ^ "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