1. n=0 -> 0
  2. n=1 -> 4
  3. n=2 -> 4
  4. n=3 -> 4
  5. n=4 -> 8
  6. n=10 -> 16
  7. n=100 -> 136
  8. n=999 -> 1332
コース一覧
コンピューターサイエンス入門:理論編
Base64 エンコード後の長さ計算

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

Base64 エンコード後の長さ計算

画像や証明書を、テキストしか通らない場所に載せたいことがあります。JSON の値、メールの本文、data: から始まる URL。そのときに使うのが Base64 です。載せる前に、どれだけ膨らむのかを見積もれると助かります。

そのままでは、テキストの中に置けない

バイト列には、改行や制御にあたる値も、画面に出せない値も含まれます。テキストとして扱われる経路に流すと、途中で書き換えられたり、そこで切られたりします。そこで、印字できる 64 種類の文字だけを使って書き直します。これが Base64 です。

暗号ではありません。受け取った側は誰でも元のバイト列に戻せます。隠したい中身は、別に暗号化しておく必要があります。

もとは、7 ビットの文字しか運べなかった時代のメールで、添付ファイルを送るために広まった仕組みです。いまも JWT の中身や、設定ファイルに書く鍵など、テキストの器にバイナリを入れたい場所で使われ続けています。

3 バイトが 4 文字になる

Base64 の 1 文字は 6 ビットを表します。バイトは 8 ビットなので、3 バイト分の 24 ビットが、ちょうど 4 文字分の 24 ビットに収まります。情報の量は変わりませんが、1 文字あたりが薄くなるぶん、長さは 4 対 3、およそ 33% 増えます。

プレーンテキスト

3 バイト 8 + 8 + 8 = 24 ビット Base64 4 文字 6 + 6 + 6 + 6 = 24 ビット
解説

300 KB の画像を data: URL に埋め込むと、HTML の側では 400 KB ほどを占めます。小さなアイコンを埋め込むかどうかは、この増分と、リクエストが 1 本減ることを見比べて決めます。

3 で割り切れないときに、1 組増える

入力が 3 の倍数とは限りません。半端が出たときは、足りないビットを 0 で埋めて 4 文字を作り、中身の無い文字の位置は = で埋めます。つまり出力は必ず 4 文字単位で、半端があれば 1 組ぶん増えます。ここで要るのが切り上げの割り算です。菓子を箱に詰める話と同じ形をしています。

Python

items = 12 per_box = 5 print(items // per_box) # 2 1 箱足りない print((items + per_box - 1) // per_box) # 3

// は切り捨てなので、そのままだと入りきらなかった分を数え落とします。割る前に、箱の大きさより 1 小さい数を足しておくと、半端があるときだけ商が 1 増えます。整数の割り算しか無い言語でも、この形なら切り上げが書けます。

JavaScript

console.log(Math.ceil(12 / 5)); // 3

JavaScript や Python なら ceil を使っても同じ結果になります。読みやすいほうを選んでください。

末尾の = は、何ビット余ったかを受け取る側に伝えるための印です。これがあるおかげで、復号したときに元のバイト数まで戻せます。長さを数えるときも、この = を含めた 4 文字単位のかたまりを数えます。

数える対象にも気をつけます。数えるのはバイト数であって、文字数ではありません。日本語の 1 文字は UTF-8 では 3 バイトなので、文字列の長さをそのまま渡すと答えがずれます。

要件

  1. 公式 ceil(n / 3) * 4 で文字数を求める
  2. n=0 のときは 0 を返す
  3. 戻り値は整数 (Base64 文字数) で、パディング = も含めた長さを表す

入出力例

base64Length(0) → 0 base64Length(1) → 4 base64Length(2) → 4 base64Length(3) → 4 base64Length(4) → 8 base64Length(10) → 16 base64Length(100) → 136 base64Length(999) → 1332

ヒント

整数除算で切り上げするには (n + 2) // 3 が便利

JavaScript では Math.ceil(n / 3) * 4 でもよい

3 バイトごとに 4 文字を出力する、と覚えると公式を導きやすい

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • URL エンコード対象文字数

    URL に直接書けない文字 (%XX エスケープが必要な文字) を数える関数を実装します。

  • IPv4 アドレスを 32bit 整数に変換

    192.168.1.1 のような IPv4 アドレスを 32bit の整数に変換する関数を作ります。

  • 32bit 整数を IPv4 アドレスに変換

    32bit の整数を 192.168.1.1 のような IPv4 文字列に戻す関数を実装します。前レッスンの逆操作です。

  • CIDR プレフィックスからネットマスクを作る

    /24 のような CIDR プレフィックスから、対応する 32bit のネットマスク (上位 prefix bit が 1) を返します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • applicationJSON 本文を送るときの Content-Type
  • URLページの住所全体
  • ビット2進数の1桁。0 か 1 のどちらか
  • HTMLHyperText Markup Languageの略。
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

Base64 エンコード後の長さ計算

⌘S で保存