Programming Self-Study Notebook

勉強したことを忘れないように! 思い出せるように!!

Base64についての事前学習

f:id:overworker:20200406080809j:plain:h250


JavaScriptはたまに使う』程度の筆者による、メモ書き程度の内容です。

Base64とは

任意のデータを64種類の英数字に変換するエンコード方式。

  • 取扱いが可能なことが多い半角英数字(64種)に変換したうえでデータを扱う
種類
小文字 a~z 26種
大文字 A~Z 26種
数字 0~9 10種
記号 +,/ 2種
合計 合計 64種
その他 = パディング文字

特徴

  • 文字列型の変数に確認可能
  • データサイズは大きくなる
    • データ量は4/3(約133%)になる
    • MIMEの基準では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れるとデータ量は約137%となる

具体例

目的 電子メールを使って画像データや音声データをやり取りする
制約 電子メールのSMTPプロトコルはASCII((7bit)しか送ることができない(MIME
手順 ①送信側があらかじめBase64フォーマット(半角英数字)に変換する(エンコード
②送信側がSMTPプロトコル上にBase64フォーマットのデータ(半角英数字)を格納し転送する
③受信側がBase64データをデコードする。
目的 JSONなどで画像データを保存する
制約 利用できるデータ形式がString形、倍精度浮動小数点型しかない
手順 ①あらかじめBase64フォーマット(半角英数字)に変換する(エンコード
JSONのプロパティにBase64フォーマットのデータ(半角英数字)を格納する
③データを利用する者はプロパティに格納されたBase64データをデコードしたうえで利用する。

JavaScriptBase64を使うとは

  • JavaScriptで取り扱いずらい画像データや音声データのようなバイナリデータをJavaScriptで取り扱いやすい「文字列(Base64)」に変換して処理(移動、保存、複製等)をすること。

変換アルゴリズム(→Base64

// ---------------
// 元の文字列
// ---------------
"abcdefg"

 ↓
// ---------------
// 手順1.
//    エンコードしたいバイナリデータを6bitずつ取り出す(足りない分は0を追加する)。
// ---------------
0x61 0x62 0x63 0x64 0x65 0x66 0x67  // (16進数表記)
 ↓
01100001 01100010 01100011 01100100 01100101 01100110 01100111  // (2進数表記)
 ↓
// 6bitずつに分解する(2進数表記)
011000, 010110, 001001,100011, 011001, 000110, 010101, 100110, 011001, 11 
 ↓
// 6bitに満たない場合は0で埋める
011000, 010110, 001001,100011, 011001, 000110, 010101, 100110, 011001, 110000

 ↓
// ---------------
// 手順2.
//    Base64の変換テーブルを用いて`英数字`に変換する
// ---------------
Y W J j Z G V m Z w

 ↓
// ---------------
// 手順3.
//    文字数が4の倍数になるように不足部分に`=`を追加する
// ---------------
YWJj ZGVm Zw==

 ↓
// ---------------
// 完成:Base64データ(文字列)
// ---------------
"YWJjZGVmZw=="

base64のビット列と英数字の変換テーブル

10進 2進 文字 10進 2進 文字 10進 2進 文字 10進 2進 文字
0 000000 A 26 011010 a 52 110100 0 62 111110 +
1 000001 B 27 011011 b 53 110101 1 63 111111 /
2 000010 C 28 011100 c 54 110110 2
3 000011 D 29 011101 d 55 110111 3
4 000100 E 30 011110 e 56 111000 4
5 000101 F 31 011111 f 57 111001 5
6 000110 G 32 100000 g 58 111010 6
7 000111 H 33 100001 h 59 111011 7
8 001000 I 34 100010 i 60 111100 8
9 001001 J 35 100011 j 61 111101 9
10 001010 K 36 100100 k
11 001011 L 37 100101 l
12 001100 M 38 100110 m
13 001101 N 39 100111 n
14 001110 O 40 101000 o
15 001111 P 41 101001 p
16 010000 Q 42 101010 q
17 010001 R 43 101011 r
18 010010 S 44 101100 s
19 010011 T 45 101101 t
20 010100 U 46 101110 u
21 010101 V 47 101111 v
22 010110 W 48 110000 w
23 010111 X 49 110001 x
24 011000 Y 50 110010 y
25 011001 Z 51 110011 z

参考文献