表紙 / 自作ソフト / 日記 / 宝箱 / サイト情報 / 検索
一般 / 新C言語 / 駄文
一覧 / 本文

uuencode, base64, base64url, base32, base32hex, base16, hex, Q-Encoding FAQ

Last update: 2007/07/01

(c)2000-2007 seclan. All rights reserved.
Homepage: http://seclan.dll.jp/
E-mail: seclan[ここはアトマークに置き換えてください]dll.jp


Q. uuencode って何?

 Unix で昔から用いられている、バイナリをテキストに変換する方式です。

基本変換方法

  1. 文字列の先頭から順に 3 文字単位で変換を行います。任意の時点の 3 つ文字 ABC のビットを次のように
    A7 A6 A5 A4 A3 A2 A1 A0   B7 B6 B5 B4 B3 B2 B1 B0   C7 C6 C5 C4 C3 C2 C1 C0  
  2. このビット列の MSB から 6 bit 毎に切り出し、上位 2 bit を 0 にしたバイト列にします。
    0 0 A7 A6 A5 A4 A3 A2  0 0 A1 A0 B7 B6 B5 B4  0 0 B3 B2 B1 B0 C7 C6  0 0 C5 C4 C3 C2 C1 C0 
  3. 各バイトに 0x20 を加算します。ただし加算の結果 0x20 になったバイトは 0x60 にします。これは、つまり「`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_」の表を引くということになります。
  4. 変換した結果を出力します。
  5. 入力文字列がなくなるまで繰返します。

uuencode ファイル作成方法

  1. 変換したいファイル名を filename、そのファイルのモードを 3 つの数字で表した値を mode とするとき、「begin mode filename」を出力します。
  2. 変換したい文字を最大 45 文字取ってきます。取得した文字数に(基本変換方法と同様に) 0x20 を加算しその値を出力します。もし文字数が 0 なら 0x60 を出力します。
  3. もし全ての文字が変換されたら(文字数が 0 なら)、「end」と改行を出力し、終了します。
  4. 取得文字数が 3 の倍数でない場合、その条件を満たすまで取得文字列の末尾に文字 0x00 を補います。
  5. 取得した文字を、基本変換方法で変換し、出力します。
  6. 改行を出力します。
  7. 2. から繰返します。

変換例

  1. ファイル名=kanji.txt, mode=644, kanji.txt のファイルの内容は、16 進数ダンプで「22 6F 57 5B」(漢字) とします。
  2. 「begin 644 kanji.txt\n」を出力します。
  3. 入力文字数=4 なので 0x24 つまり文字 '$' を出力します。
  4. 漢字 (0x22 0x6F 0x57 0x5B) → (3 の倍数にする)
    0x22 0x6F 0x57 0x5B 0x00 0x00 → (ビット表記)
    0010_0010 0110_1111 0101_0111 0101_1011 0000_0000 0000_0000 → (6 bit 毎に分解)
    001000 100110 111101 010111 010110 110000 000000 000000→ (16 進数による表記)
    0x08 0x26 0x3D 0x17 0x16 0x30 0x00 0x00 → (0x20 を加算。0x00 は 0x60 に)
    0x28 0x46 0x5D 0x37 0x36 0x50 0x60 0x60→ (ASCII 文字表記)
    (F]76P``
  5. 改行を出力します。つまりこの行では、「$(F]76P``\n」を出力します。
  6. 「`\n」を出力します。
  7. 「end\n」を出力します。
  8. 最終的に出力されたものは次のようになります。
    begin 644 kanji.txt
    $(F]76P``
    `
    end

Q. base64 / base64url って何?

Q. base64 って何?

 base64 とは、uuencode を参考にして、新たに作成された、バイナリをテキストに変換する方式です。uuencode と比較すると、ISO 646 で問題になるような文字、例えば記号、が変換後の文字になるべく出現しないようになっています。RFC2045 (MIME Part One) で定義されています。

変換方法

  1. 文字列の先頭から順に 3 文字単位で変換を行います。任意の時点の 3 つ文字 ABC のビットを次のように表現します。ただし、3 文字に足りない場合には、残りの文字として 0x00 を補います。そして補った個数を記憶しておきます。
    A7 A6 A5 A4 A3 A2 A1 A0   B7 B6 B5 B4 B3 B2 B1 B0   C7 C6 C5 C4 C3 C2 C1 C0  
  2. このビット列の MSB から 6 bit 毎に切り出し、上位 2 bit を 0 にしたバイト列にします。
    0 0 A7 A6 A5 A4 A3 A2  0 0 A1 A0 B7 B6 B5 B4  0 0 B3 B2 B1 B0 C7 C6  0 0 C5 C4 C3 C2 C1 C0 
  3. 表「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/」を引き、それぞれの対応文字を出力します。ただし、
    1. 一行に許される最大文字数は 76 文字 なので、それ以上になる場合には、改行します。
    2. もし 0x00 を 1個補っている場合、3 文字出力し、最終バイトは '=' を出力します。
    3. もし 0x00 を 2個補っている場合、2 文字出力し、最終バイトは '=' を二つ出力します。
  4. 入力文字列がなくなるまで繰返します。

変換例

  • 漢字 (0x22 0x6F 0x57 0x5B) → (3 の倍数にする)
    0x22 0x6F 0x57 0x5B 0x00 0x00 → (ビット表記)
    0010_0010 0110_1111 0101_0111 0101_1011 0000_0000 0000_0000 → (6 bit 毎に分解)
    001000 100110 111101 010111 010110 110000 000000 000000→ (16 進数による表記)
    0x08 0x26 0x3D 0x17 0x16 0x30 0x00 0x00 → (変換: 2 個 0x00 を補ったので 2 つの 0x00 は '=' に)
    I m 9 X W w = = → 
    "Im9XWw=="

Q. base64url って何?

 base64url とは、base64 を基に RFC4648 で規定された変換方式で、url とファイル名に使用しても安全になるように設計されています。変更点は、base64 では + と / が使用されていますが、それを - と _ を使用するようにします。具体的には、base64では「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/」の表で変換しますが、base64url では「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_」を使用します。

Q. base32 / base32hex って何?

Q. base32 って何?

 base64 では、大文字小文字の区別がない環境ではうまく動作しません。そこで、大文字小文字の区別がない場合でもうまく動作するよう考えられたのが base32 です。

変換方法

  1. 文字列の先頭から順に 5 文字単位で変換を行います。任意の時点の 5 つ文字 ABCDE のビットを次のように表現します。ただし、5 文字に足りない場合には、残りの文字として 0x00 を補います。そして補った個数を記憶しておきます。
    A7 A6 A5 A4 A3 A2 A1 A0   B7 B6 B5 B4 B3 B2 B1 B0   C7 C6 C5 C4 C3 C2 C1 C0   D7 D6 D5 D4 D3 D2 D1 D0   E7 E6 E5 E4 E3 E2 E1 E0  
  2. このビット列の MSB から 5 bit 毎に切り出し、上位 3 bit を 0 にしたバイト列にします。
    0 0 0 A7 A6 A5 A4 A3   0 0 0 A2 A1 A0 B7 B6   0 0 0 B5 B4 B3 B2 B1   0 0 0 B0 C7 C6 C5 C4   0 0 0 C3 C2 C1 C0 D7   0 0 0 D6 D5 D4 D3 D2   0 0 0 D1 D0 E7 E6 E5   0 0 0 E4 E3 E2 E1 E0  
  3. 表「ABCDEFGHIJKLMNOPQRSTUVWXYZ234567」を引き、それぞれの対応文字を出力します。ただし、
    1. もし 0x00 を 1個補っている場合、7 文字出力し、最終バイトは '=' を出力します。
    2. もし 0x00 を 2個補っている場合、5 文字出力し、最終バイトは '=' を三つ出力します。
    3. もし 0x00 を 3個補っている場合、4 文字出力し、最終バイトは '=' を四つ出力します。
    4. もし 0x00 を 4個補っている場合、2 文字出力し、最終バイトは '=' を六つ出力します。
  4. 入力文字列がなくなるまで繰返します。

変換例

  • 漢字 (0x22 0x6F 0x57 0x5B) → (5 の倍数にする)
    0x22 0x6F 0x57 0x5B 0x00 → (ビット表記)
    0010_0010 0110_1111 0101_0111 0101_1011 0000_0000 → (5 bit 毎に分解)
    00100 01001 10111 10101 01110 10110 11000 00000 → (16 進数による表記)
    0x04 0x09 0x17 0x15 0x0e 0x16 0x18 0x00 → (変換: 1 個 0x00 を補ったので 1 つの 0x00 は '=' に)
    E J X V O W Y = → 
    "EJXVOWY="

Q. base32hex って何?

 base32hex とは、base32 変換後でもソートの順番が変わらないよう変換後のアルファベットを工夫した変換方式です。 具体的には、base32では「ABCDEFGHIJKLMNOPQRSTUVWXYZ234567」の表で変換しますが、base32hex では「0123456789ABCDEFGHIJKLMNOPQRSTUV」を使用します。

Q. base16 (hex) って何?

 base16 または hex とは、いわゆるバイナリの 16進数表記のことです。具体的には、4 bit 毎に「0123456789ABCDEF」で変換します。

変換例

  • 漢字 (0x22 0x6F 0x57 0x5B) → (16 進数表記)
    0x22 0x6F 0x57 0x5B → (変換)
    "226F575B"

Q. Q-Encoding って何?

 大部分が US-ASCII で記述されているが、一部だけ外れているというようなテキストを、ASCII に変換して扱うために作成されました。RFC2045 (MIME Part One) で定義されています。

変換方法

  1. あるバイト 0xBB がある時、それを '=BB' というように、'=' を先頭に付加し、次にバイトの 16 進数表記を 2 文字で記述することを変換すると定義します。ただし、16 進数表記で使用されるアルファベット部分 'A', 'B', ... は、必ず大文字を使用します。
  2. 次のように文字を変換します。
    • 0x21('!')-0x3C('<'), 0x3E('>')-0x7E('~') の文字は ASCII でそのままの表示が可能です。(つまり Control-Code, 空白(SPC), '=', DEL を除いた部分)
    • 0x09(TAB), 0x20(SPC) は、行末以外の部分ではそのまま表示が可能です。行末部分では、=09 や =20 のように変換する必要があります。
    • 行末をあらわす CRLF は、そのまま変換せずに表示します。ただし、バイナリデータを変換した場合にはこの限りではありません。
    • それ以外の文字は、変換します。例えば、文字として出現する '=' は必ず '=3D' に変換します。
    • RFC2047 (MIME Part Three) によると、'?' と '_' の文字は、必ず '=3F' や '=5F' に変換した方が良いようです。なぜならば、MIME では '?' は '?=' のように使用されることがあり、'_' は 0x20(SPC) の代用で使用されることがあるからです。またメールメッセージヘッダではさらに使用可能文字が制限されることがあります。
  3. 一行は 76 文字以下である必要があります。それを超える場合には、'=' を行末に挿入して、次の行に続くことを示します。この 76 文字には改行文字は含まれませんが、'=' などの文字は含まれます。

変換例

  • 漢字 (0x226F 0x575B) → 変換 →
    =22=6F=57=5B

表紙 - 著作権 - 注意事項 - リンクについて - 404 エラーについて
(c)2000-2007 seclan. All rights reserved.