xxencode と xxdecode の使い方
エンコードするには:
- 入力 · テキスト にテキストを入力するか貼り付けます。xxencode されたブロックが 出力 · xxencode に表示されます。
- 出力の下の ファイル名 を、受け取る人に渡したい名前にします。デフォルトは
data.binです。 - データ行だけが必要なら begin/end 行 のチェックを外します。
デコードするには:
- 方向の切り替えで xxencode → テキスト をクリックします。
- ブロックを貼り付けます。メールヘッダーやメモなど、
begin行より前のテキストは読み飛ばされます。 - 結果を読むか、バイナリの内容なら 変換先 を Hex(16進数) にするか、バイトを保存 をクリックして
begin行の名前でダウンロードします。
xxencode が生まれた理由
uuencode のアルファベットはスペース(またはバッククォート)から _ までのすべての文字で、[、]、^、\、! を含みます。これらの文字は、IBM のメインフレームや BITNET ネットワークなど、ASCII と EBCDIC のシステム間のメールゲートウェイで問題を起こしました。EBCDIC に一対一で対応する文字がなかったからです。ファイルは文字が入れ替わった状態で届き、デコードすると意味のないデータになりました。
xxencode は uuencode の構造を保ったまま、アルファベットを確実に変換できる 64 文字(+、-、0~9、A~Z、a~z)に置き換えたものです。値 0 は +、値 1 は -、数字は値 2 から始まり、小文字の z が 63 です。
uuencode と xxencode の比較
同じ入力を、ファイル名 hello.txt で両方の形式にしたものです。
| 入力 | uuencode のデータ行 | xxencode のデータ行 |
|---|---|---|
Cat | #0V%T | 1Eq3o |
Hello, world | ,2&5L;&\L('=O<FQD | AG4JgP4wg65RjQalY |
| ゼロのバイト 4 つ | $```````` | 2++++++++ |
各行の先頭の文字は、その形式自身のアルファベットで表したバイト数です。3 は uuencode では #、xxencode では 1、12 は , と A、4 は $ と 2 です。45 バイトの満杯の行は、uuencode では M、xxencode では h で始まります。
xxencode されたファイル全体は次のようになります。ここでは The quick brown fox jumps over the lazy dog. 0123456789 を fox.txt として保存しています。
begin 644 fox.txt
hJ4VZ653pOKBf647mPrRi64NjS0-eRKpkQm-jRaJm65FcNG-gMLdt64FjNmsU
8A12mAnEpBXQsCE++
+
end
サイズは uuencode と同じです。3 バイトにつき 4 文字に加え、各行に長さを表す文字と改行が付くので、入力より約 38% 大きくなります。
Python での xxencode
Python に xxencode はありませんが、binascii.b2a_uu が同じ 6 ビットの値を出力するので、その出力を uuencode のアルファベットから xxencode のアルファベットに置き換えれば、長さの文字も含めて正しい xxencode の行が得られます。
import binascii
UU = "`" + "".join(chr(c) for c in range(33, 96))
XX = "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
TO_XX = str.maketrans(UU, XX)
def xxencode_line(chunk: bytes) -> str:
return binascii.b2a_uu(chunk, backtick=True).decode().translate(TO_XX)
xxencode_line(b"Cat") # '1Eq3o\n'
45 バイトずつ渡し、先頭に begin 644 name、末尾に + と end を付け加えてください。デコードには str.maketrans(XX, UU) で置き換えてから、各行に binascii.a2b_uu を呼びます。バイト列とエンコードについては Python のページ を参照してください。
よくある問題
- xxencode だと言われたファイルから意味のない出力が出る。 満杯の行の先頭の文字を確認してください。
Mなら uuencode のファイルなので、uuencode ツール を使ってください。 - 行のデコード結果の長さがおかしい。 長さを表す文字が変わったか失われています。行を折り返し直したメールクライアントが原因であることがよくあります。xxencode では、分割されたり結合されたりした行は復元できません。
- デコードしたファイルが途中で切れる。 ブロックが複数のパートに分けて投稿されています。
beginとendを 1 つずつにして順番どおりにつなぎ、その結果をデコードしてください。
よくある質問
xxencode と uuencode の違いは何ですか?
アルファベットだけです。どちらも 3 バイトを 4 文字にし、最大 45 バイトの行に長さを表す文字を付け、begin と end で囲みます。uuencode はバッククォートと ! から _ までの ASCII の範囲を使い、xxencode は +、-、数字、英字を使います。
ファイルが xxencode か uuencode かを見分けるには?
満杯のデータ行の先頭の文字を見ます。どちらも 45 バイトを表しますが、M なら uuencode、h なら xxencode です。`、#、% のような記号だらけの行なら uuencode です。
xxencode されたファイルをデコードできるプログラムは?
UUDeview は両方の形式を扱え、Debian や Ubuntu では uudeview パッケージです。GNU sharutils の uudecode は uuencode と Base64 は読めますが、xxencode は読めません。
xxencode のファイルが + の行で終わるのはなぜですか?
+ は xxencode で 0 を表す文字なので、+ だけの行は長さ 0 のデータ行です。uuencode でバッククォート 1 つだけの行が end の直前に置かれるのと同じ役割です。