AZ Tools
← ガイド

進数とテキストエンコーディング: 開発者向けチートシート

数値もテキストも、コンピューターの中では結局同じもの、つまりビットになります。しかし開発者は、人に優しい表現と機械に優しい表現の間を絶えず行き来します — 16進カラーコード、Base64 トークン、URL エスケープされたクエリ文字列。本ガイドは、毎日出会う進数とエンコーディング、そしてそれぞれが実際に何のためにあるのかの実用的な地図です。

進数: 同じ値、違う装い

「進数(base)」とは、位取り記数法が次の桁へ繰り上がる前に使う、異なる数字の個数にすぎません。10進数は 0–9、2進数は 0 と 1、8進数は 0–7、16進数は 0–9 のあと A–F を使います。進数が変わっても数そのものは変わりません — 書き方が変わるだけです。2進数の 11111111、8進数の 377、10進数の 255、16進数の FF はすべてまったく同じ値です。

16進数がプログラマーに好まれるのは、16進1桁がちょうど4ビット(ニブル)に対応し、16進2桁がちょうど1バイトになるからです。そのため16進数は生のバイナリを簡潔かつ無損失で読む方法になります — 色(#FF8800)、メモリアドレス、バイトダンプが16進数で書かれる理由です。

進数間の変換

これらの変換は純粋に機械的です — まさにツールが代わりにやるべき類のことです — が、操作の形を知っておくと、結果を検算したり、コード中の 0x、0o、0b 接頭辞が何を意味するかを理解したりするのに役立ちます。

  • 2進数 ↔ 16進数: ビットを右から4つずつまとめます; 4ビットのまとまり1つが16進1桁です(1010 1100 = AC)。
  • 任意の進数 → 10進数: 各桁にその桁の重み(進数の位置乗)を掛けて足します。
  • 10進数 → 任意の進数: 進数で繰り返し割ります; 余りを最後から最初へ読むとそれが各桁です。

文字からバイトへ: UTF-8

テキストはエンコードするまでバイトではありません。文字集合は各文字に番号(「コードポイント」)を割り当て — Unicode がその普遍的な標準です — エンコーディングはその番号がどうバイトになるかを決めます。UTF-8 はウェブで支配的なエンコーディングです: ASCII 文字は1バイト、その他の文字は2〜4バイトを取り、英語テキストを簡潔に保ちつつ、あらゆる文字体系と絵文字を表現します。

だから文字列の文字数とバイト数は異なりえます: 'café' は4文字ですが UTF-8 では5バイトです。é が2バイト必要だからです。ハッシュ化、サイズ制限、バイナリ形式はすべてバイトを気にするため、この区別は実務で重要です。

Base64: 安全なテキストとしてのバイト

Base64 は逆の仕事をします: 任意のバイトを64個の安全な文字(A–Z、a–z、0–9、および + と /)の文字列に変えます。メール、JSON、URL、HTML data: URI など多くのシステムはテキスト向けに作られており、生のバイナリを壊しかねないため存在します。Base64 を使えば、テキスト専用の経路で画像や鍵を無傷で運べます。

代償はサイズです: Base64 は3バイトごとに4文字へエンコードするので、出力は入力より約33%大きくなります。これは暗号化ではなくエンコードであり — 誰でもデコードできます — したがって転送中の破損は防いでも、覗き見は決して防ぎません。

URL とパーセントエンコーディング

URL には独自の規則があります。URL 内で特別な意味を持つ文字(スペース、&、?、#、/)は、% の後にそのバイト値を16進で続けた「パーセントエンコーディング」で表す必要があります — スペースは %20、アンパサンドは %26 になります。これにより、クエリ文字列はアドレスを壊さずに任意のテキストを運べます。

パーセントエンコーディングは文字の UTF-8 バイトに対して働き、これがすべてを結びつけます: テキストはコードポイントになり、コードポイントは UTF-8 バイトになり、バイトは %XX の組になります。開発者が遭遇するエンコーディングのバグのほとんどは、これらの層のどれかを別のものと取り違えることから生じます。

関連ツール