uuencode と uudecode の使い方
エンコードするには:
- 入力 · テキスト にテキストを入力するか貼り付けます。uuencode されたブロックが 出力 · uuencode に表示されます。
- 出力の下の ファイル名 を設定します。これが
begin行に入ります。デフォルトはdata.binです。 - ほかの形式に埋め込む場合など、エンコードされた行だけが必要なら begin/end 行 のチェックを外します。
デコードするには:
- 方向の切り替えで uuencode → テキスト をクリックします。
- uuencode されたデータを貼り付けます。周りのメールやニュースのテキストを含んでいてもかまいません。
begin行より前はすべて読み飛ばされます。 - 出力欄のテキストを読むか、バイトを保存 をクリックして、
begin行のファイル名でデコードしたファイルをダウンロードします。バイナリの内容なら、先に 変換先 を Hex(16進数) にして中身を確認してください。
uuencode ファイルの構造
テキスト Cat をファイル名 hello.txt でエンコードすると、次のようになります。
begin 644 hello.txt
#0V%T
`
end
begin 644 hello.txtは Unix のパーミッションとファイル名を表します。- 各データ行は長さを表す文字で始まります。その行のバイト数に 32 を足した値です。
#は 35 なので、この行には 3 バイトが入っています。満杯の行は 45 バイトを持ち、Mで始まって 60 文字が続きます。 - データの文字の仕組みは基本的に Base64 と同じです。3 バイトごとに 6 ビットの値 4 つになり、各値 v はコード v + 32 の文字で書かれます。値 0 はスペースではなくバッククォートで書かれます。
- バッククォート 1 つだけの行は長さ 0 の空行で、
endがブロックを閉じます。
もっと長い入力では、満杯の行の構造がわかります。
begin 644 fox.txt
M5&AE('%U:6-K(&)R;W=N(&9O>"!J=6UP<R!O=F5R('1H92!L87IY(&1O9RX@
*,#$R,S0U-C<X.0``
`
end
これは The quick brown fox jumps over the lazy dog. 0123456789 で、M の行に 45 バイト、* の行に 10 バイト(42 − 32 = 10)が入っています。各行がそれぞれの長さと改行を持つので、uuencode されたデータは入力より約 38% 大きくなり、Base64 より少し大きめです。
uuencode が今も見られる場所
uuencode は Unix-to-Unix Copy(UUCP)に由来し、MIME 以前はメールや Usenet でバイナリファイルを送る標準的な方法でした。現在では、古いメールのアーカイブ、Usenet の投稿、一部の組み込み機器やメインフレームのファイル転送、ファイルを mail にパイプするスクリプトなどで見かけます。
バッククォートの慣習はその時代に生まれました。行末のスペースを削るゲートウェイがあり、ゼロをスペースで表したデータは壊れてしまいましたが、バッククォートなら残ります。このエンコーダーはバッククォートで書き、デコーダーはどちらも受け付けます。
コマンドラインと Python での uuencode
GNU sharutils がインストールされていれば、次のように使えます。
uuencode hello.txt hello.txt > hello.uu
uudecode hello.uu
最初の引数は入力ファイル、2 番目は begin 行に書き込む名前です。uudecode はカレントディレクトリにその名前でファイルを作成します。Base64 で出力したい場合は uuencode に -m を付けます。
Python では、binascii が最大 45 バイトの 1 行ずつエンコードします。
import binascii
binascii.b2a_uu(b"Cat", backtick=True) # b'#0V%T\n'
binascii.a2b_uu(b"#0V%T") # b'Cat'
begin 644 name の行、最後のバッククォートの行、end は自分で付け加えてください。ほかのエンコードの例は Python のページ にあります。
よくある問題
- 位置 1 でエラーになる。
begin行がなく、テキストが uuencode された行だけでもありません。ブロック全体をコピーしたか確認してください。 begin-base64ブロックから意味のない出力が出る。 そのブロックはuuencode -mで書かれた Base64 です。begin-base64と====の間の行を Base64 デコーダー にコピーしてください。- ファイルが途中で切れる、または行末付近のバイトがおかしい。 メールクライアントが行を折り返し直したか、行末のスペースを削りました。データ行はすべて完全である必要があります。元の添付ファイルかメッセージのソースを入手してください。
- 複数パートの投稿が一部しかデコードされない。 大きなファイルは複数のメッセージに分割されることがよくありました。デコードの前に、
beginとendを 1 つずつ残して、パートを順番どおりにつなげてください。
よくある質問
uuencode: command not found を直すには?
ほとんどの Linux システムでは、このコマンドはデフォルトでインストールされていません。Debian や Ubuntu では sudo apt install sharutils で uuencode と uudecode が入ります。Fedora にも sharutils パッケージがあります。
begin 644 はどういう意味ですか?
644 はデコードしたファイルに付ける Unix のファイルモード(所有者は読み書き、それ以外は読み取りのみ)で、その後の単語がファイル名です。uudecode はそのファイルを作成します。このページでは、その名前を バイトを保存 に使います。
uuencode は Base64 と同じですか?
どちらも 3 バイトを 4 文字にしますが、uuencode はスペースからアンダースコアまでの ASCII の範囲を使い、各行に長さを表す文字を付けます。Base64 はアルファベットが異なり、MIME メールで使われているのはこちらです。uuencode -m は begin-base64 ブロックの中に Base64 を書き出します。
Python で今も uuencode されたファイルをデコードできますか?
はい。binascii.a2b_uu で 1 行ずつデコードできます。上位の uu モジュールは Python 3.11 で非推奨になり、3.13 で削除されました。