BASE64について
Base64について
Base64とは
Base64は、通信などのマルチバイト文字やバイナリデータを扱えない環境において、印字可能文字列に変換するエンコーディング法です。
メールなどで画像や音声ファイルなどのバイナリデータを送信する際に、中身をテキストデータに置換することに用いられます。
印字可能文字列とは
印字可能文字列とは、ASCII文字のうちの65文字([A-Za-z0-9+/]の64文字と'=')と定義されています。
なお、この変換によってデータ量は4/3(約133%)になります。
また、MIMEの基準では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れるとデータ量は約137%となります。
BASE64変換処理
文字列「abcd」をBASE64エンコードする例を記載します。
1, 対象データを16進法に変換します。
0x61 0x62 0x63 0x64
2, 2進数に変換します。
0110 0001 0110 0010 0110 0011 0110 0100
3, 6bitに区切る。(余った分には0パディングを行う)
011000 010110 001001 100011 011001 000000
4, BASE64変換表を基に、4文字ずつ変換する。(4文字に満たない場合には「=」パディングする)
24 22 9 35 25 0
Y W J j Z A = =
以上の操作により、文字列「abcd」をBASE64エンコードしたデータ「YWJjZA==」が生成できました。
BASE64変換表
10進数 | 2進数 | 文字 | 10進数 | 2進数 | 文字 | 10進数 | 2進数 | 文字 | 10進数 | 2進数 | 文字 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 000000 | A | 16 | 010000 | Q | 32 | 100000 | g | 48 | 110000 | w |
1 | 000001 | B | 17 | 010001 | R | 33 | 100001 | h | 49 | 110001 | x |
2 | 000010 | C | 18 | 010010 | S | 34 | 100010 | i | 50 | 110010 | y |
3 | 000011 | D | 19 | 010011 | T | 35 | 100011 | j | 51 | 110011 | z |
4 | 000100 | E | 20 | 010100 | U | 36 | 100100 | k | 52 | 110100 | 0 |
5 | 000101 | F | 21 | 010101 | V | 37 | 100101 | l | 53 | 110101 | 1 |
6 | 000110 | G | 22 | 010110 | W | 38 | 100110 | m | 54 | 110110 | 2 |
7 | 000111 | H | 23 | 010111 | X | 39 | 100111 | n | 55 | 110111 | 3 |
8 | 001000 | I | 24 | 011000 | Y | 40 | 101000 | o | 56 | 111000 | 4 |
9 | 001001 | J | 25 | 011001 | Z | 41 | 101001 | p | 57 | 111001 | 5 |
10 | 001010 | K | 26 | 011010 | a | 42 | 101010 | q | 58 | 111010 | 6 |
11 | 001011 | L | 27 | 011011 | b | 43 | 101011 | r | 59 | 111011 | 7 |
12 | 001100 | M | 28 | 011100 | c | 44 | 101100 | s | 60 | 111100 | 8 |
13 | 001101 | N | 29 | 011101 | d | 45 | 101101 | t | 61 | 111101 | 9 |
14 | 001110 | O | 30 | 011110 | e | 46 | 101110 | u | 62 | 111110 | + |
15 | 001111 | P | 31 | 011111 | f | 47 | 101111 | v | 63 | 111111 | / |
rubyでのBASE64エンコード方法
Ruby言語ではBASE64を扱うための機能(ライブラリ)が標準で用意されています。
下記のようにメソッドを呼び出すだけで、BASE64の変換が容易に行えます。
require 'base64'
p Base64.b64encode("日本語") # => "xvzL3Ljs\n"
p Base64.decode64('xvzL3Ljs') # => "日本語"