印刷可能な文字だけで構成されるので、文字列として取り扱う事ができます。 連結したりするのにも通常の文字列系の関数などが利用できます。
実際に使用される文字は"0~9"の10文字、"a~z"の26文字、"A~Z"の26文字、"+/"の2文字の計64種類の文字でデータを表します。 最後にデータ無しを表す'='が含まれる場合がありますので、 実質的には65文字を利用します。
データの変換の方法は、 データを6bitずつ区切って24ビット毎に4文字に変換していって、最後の6bitに満たない部分は0で埋めます。 最終的に、データが4文字に満たなかった部分は'='を追加します。
データを6bit毎に区切ると、6bitで表せる数値は、0x00~0x3fの64種類になります。 6bit毎に区切った0x00から0x3fの数値を文字列に変換します。
文字 | 変換する値(16進) | 文字 | 変換する値(16進) | |
---|---|---|---|---|
A | 0x00 | g | 0x20 | |
B | 0x01 | h | 0x21 | |
C | 0x02 | i | 0x22 | |
D | 0x03 | j | 0x23 | |
E | 0x04 | k | 0x24 | |
F | 0x05 | l | 0x25 | |
G | 0x06 | m | 0x26 | |
H | 0x07 | n | 0x27 | |
I | 0x08 | o | 0x28 | |
J | 0x09 | p | 0x29 | |
K | 0x0a | q | 0x2a | |
L | 0x0b | r | 0x2b | |
M | 0x0c | s | 0x2c | |
N | 0x0d | t | 0x2d | |
O | 0x0e | u | 0x2e | |
P | 0x0f | v | 0x2f | |
Q | 0x10 | w | 0x30 | |
R | 0x11 | x | 0x31 | |
S | 0x12 | y | 0x32 | |
T | 0x13 | z | 0x33 | |
U | 0x14 | 0 | 0x34 | |
V | 0x15 | 1 | 0x35 | |
W | 0x16 | 2 | 0x36 | |
X | 0x17 | 3 | 0x37 | |
Y | 0x18 | 4 | 0x38 | |
Z | 0x19 | 5 | 0x39 | |
a | 0x1a | 6 | 0x3a | |
b | 0x1b | 7 | 0x3b | |
c | 0x1c | 8 | 0x3c | |
d | 0x1d | 9 | 0x3d | |
e | 0x1e | + | 0x3e | |
f | 0x1f | / | 0x3f |
Shift-JISコードの"hello"をでBase64にエンコードすると、こんな感じの文字列になるよ。最後の'='は 変換の際に4文字に満たなくて追加されたデータ無しを表すパディングだよ。 "aGVsbG8="
では、実際に"hello"をBase64にエンコードしてみるね!!。
Shift-JISコードの"hello"をバイナリデータに変換すると、以下のようになります。
文字 | バイナリデータ(16進) | バイナリデータ(2進) |
---|---|---|
h | 0x68 | 01101000 |
e | 0x65 | 01100101 |
l | 0x6C | 01101100 |
l | 0x6C | 01101100 |
o | 0x6F | 01101111 |
そして、2進数をつなげると 0110100001100101011011000110110001101111 となります。
この値を6bit毎に区切ってさきほどのテープルに照らし合わせて4文字ずつ変換します。
6bitに区切ったデータ | 値(16進数) | 変換した文字列 |
---|---|---|
011010 | 0x1a | a |
000110 | 0x06 | G |
010101 | 0x15 | V |
101100 | 0x1c | s |
6bitに区切ったデータ | 値(16進数) | 変換した文字列 |
---|---|---|
011011 | 0x1b | b |
000110 | 0x06 | G |
1111xx | 0x3c | 8 |
xxxxxx | ---- | = |
'x'の部分は0として扱います。変換元のデータ6bitに満たないまたは、4文字に満たない為に追加しています。
"hello"がbase64にエンコードされると、"aGVsbG8="になる仕組みが理解できましたか?
え~解らなかったの~!?
ごめんね~解らなかったら、もう一度、読み直してみてね!!。
注意!! Base64はデータ形式が文字列なので、そのままURLのクエリに使えそうなイメージがありますが、 "+/="が利用されているので、そのままURLのクエリに使用すると"+/="が、区切り文字として扱われてしまうので、 そのままURLのクエリとして使用しないでね。 クエリとして使用する場合は、さらにURLエンコードをしてから使用してね。
Base64は、データを64種類の印刷可能な英数字のみで表現するデータだよ。 7bitのデータしか扱うことのできない電子メールなどに使われているんだよ。 "QkFTRTY0pMvK0bS5pLmk66ToPw==" こんな感じのデータです。見たことあるかなぁ?
必ずある訳ではないのだけど、最後に'='が何個かついているのが特徴だよ!!