<目次>
(1) Base64とは?概要やアルゴリズムについてご紹介
(1-1) Base64とは?
(1-2) Base64の仕組み
(1-3) Base64の実装
(1) Base64とは?概要やアルゴリズムについてご紹介
(1-1) Base64とは?
●概要
バイナリ⇒テキスト(ASCII形式)にエンコードする方式です。あらゆる文字(漢字、絵文字、画像も)を、可読の文字(ASCII形式)に変換可能にする事で、保存や転送を可能にします。ネットワーク間でバイナリ形式のデータを「テキスト形式で運ぶ」目的で作られました。Base64ではあらゆる形式のデータを「文字列」に変換する事が出来るため、テキストデータを保存・転送するメディア等にも対応しているのがBase64の強みです。
●なぜ必要?
文字列に変換する目的は、どんな経路でも内容を正しく運ぶためです。プロトコルによっては、バイナリデータの一部を意図せず「制御文字」として認識したりする事で、バイナリデータが変化してしまう可能性もゼロではありません。そうした危険を防ぐためにも、予めBase64での変換を行った上で転送します。
●なぜ64?
エンコーディング処理の過程において、64種類の文字(=2^6)を使用するためです。この64文字は、ほぼ全てのエンコーディング方式にて利用可能です。
(1-2) Base64の仕組み
●仕組み
Base64のエンコーディングは、「US-ASCII」文字セットの内の65文字を用いて行います。その内の最初の64文字(アルファベット大文字&小文字+数字+「+」+「/」)には、それぞれ対応する6ビット(2^6ビット=64個)の値が割り当てられており、最後にお65文字目(=)はパディング(データ長を一定に保つ為のデータ)です。
(表)
0 A |
20 U |
40 o |
60 8 |
1 B |
21 V |
41 p |
61 9 |
2 C |
22 W |
42 q |
62 + |
3 D |
23 X |
43 r |
63 / |
4 E |
24 Y |
44 s |
(pad) = |
5 F |
25 Z |
45 t |
|
6 G |
26 a |
46 u |
|
7 H |
27 b |
47 v |
|
8 I |
28 c |
48 w |
|
9 J |
29 d |
49 x |
|
10 K |
30 e |
50 y |
|
11 L |
31 f |
51 z |
|
12 M |
32 g |
52 0 |
|
13 N |
33 h |
53 1 |
|
14 O |
34 i |
54 2 |
|
15 P |
35 j |
55 3 |
|
16 Q |
36 k |
56 4 |
|
17 R |
37 l |
57 5 |
|
18 S |
38 m |
58 6 |
|
19 T |
39 n |
59 7 |
|
●処理の基本的な流れ
Base64のエンコーディング処理は、入力ストリーム(連続したバイト読込み)から1バイト(8ビット)単位にデータを受信し、それを左→右に8ビット×3=24ビットのグループ(3文字)にまとめて処理していきます。
(例)RainbowEngineの場合
01010010 01100001 01101001 = R a i
01101110 01100010 01101111 = n b o
01110111 01000101 01101110 = w E n
01100111 01101001 01101110 = g i n
・①8ビットのデータ3組を受信し、左から並べて連結して24ビットのグループを作ります。
01010010 01100001 01101001 = R a i
・②「①」の状態を、6ビット×4組に区切り直し、Base64の1文字に対応するように先頭2ビットに0を埋めて、8ビット×4組に仕上げます(実際のプログラムでは、マスクとビットシフトを組み合わせて実装)。
(前)8ビット×3組
01010010 01100001 01101001
↓
(中)6ビット×4組
010100 100110 000101 101001
↓
(後)8ビット×4組
00010100 00100110 00000101 00101001
(図121)
・③6ビットに区切り直した各データをBase64のアルファベットに変換します。
(前)8ビット×4組
00010100 00100110 00000101 00101001
↓
変換表(表1)に従って変換
↓
(後)Base64のエンコーディング完了
U m F p
基本的には、入力された文字列に対して上記①~③を繰り返していきますが、文字数が丁度3で割り切れない場合は、最後の端数の1文字or2文字に対しては少し特殊な処理を行う必要があります(→次の④)。
・④受信データが8ビットのデータ3組(24ビット)に満たない場合
不足分を0埋めで補います。8ビットが全て「0」の場合は「=」に変換されるため、次の2パターンに分類され、「=」が1回か2回登場します。
(a)余り部分=8ビットの場合
8ビット + 0埋め×4個 → 6ビット×2組を形成 +「=」を2個追加
(b)余り部分=16ビットの場合
16ビット + 0埋め×2個 → 6ビット×3組を形成 +「=」を1個追加
(1-3) Base64の実装
→(参考)Base64のサンプルプログラム(C++)の紹介と解説 ★