コンピューターサイエンス入門:理論編
Base64 エンコード後の長さ計算
この回でやること
Base64でデータが膨らむ理由を読み解き、末尾の印を含む文字数を確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
画像や証明書を、テキストしか通らない場所に載せたいことがあります。JSONの値、メールの本文、データを埋め込んだURL。そのときに使うのがBase64です。載せる前に、どれだけ膨らむのかを見積もれると助かります。
テキストの中へ置ける形にする
バイト列には、画面に出せない値や制御に使う値も含まれます。文字として扱う経路では、途中で書き換えられることがあります。そこで64種類の文字で表し直します。Base64は暗号ではなく、誰でも元のバイト列に戻せます。秘密にしたい中身は別に暗号化する必要があります。
もとは、7ビットの文字しか運べなかった時代のメールで、添付ファイルを送るために広まった仕組みです。今も設定ファイルに鍵を書くなど、テキストの器にバイナリを入れる場面で使います。
3バイトが4文字になる
Base64の1文字は6ビットを表します。3バイトは24ビットなので、4文字分にちょうど収まります。情報の量は変わらず、表記の長さが増えます。
プレーンテキスト
3バイト = 8 × 3 = 24ビット
4文字 = 6 × 4 = 24ビット現場の話として、300 KBの画像をURLに埋め込むと、Base64の部分は約400 KBになります。小さなアイコンを埋め込むかは、この増分と、画像取得の要求が1本減ることを見比べて決めます。
半端も4文字の1組として数える
ここでは末尾に = を付ける標準の形式を考えます。3バイトで割り切れなければ、足りないビットを0で補います。元のデータがない文字の位置には = を置きます。残りが1バイトなら2個、2バイトなら1個の = が付き、どちらも4文字になります。
入力のバイト数を3で割り、端数を切り上げた組数に4を掛けます。= も文字数に含めます。たとえば空の入力は0文字で、3バイトなら4文字、4バイトなら8文字です。改行やURLの前置きは、この文字数に含めません。
数えるのは見た目の文字数ではなくバイト数です。たとえば「猫」はUTF-8で3バイトです。日本語でも文字によってバイト数が違うので、元の文字列の長さをそのまま使ってはいけません。
例題で確かめる
証明書の断片が10バイトあります。9バイトで3組、残り1バイトでさらに1組なので、合計4組です。4 × 4 = 16文字になります。最後の組には = が2個付きます。10 × 4 ÷ 3を切り捨てた13文字では、4文字単位という規則に合いません。