16進数とは
16進数(hexadecimal/ヘクサデシマル、16進/ヘックス)は、0~9とA~Fの16種類の数字を使って値を表す記数法です。A〜Fは十進数の10〜15に相当します。
一桁で0〜15、つまり4ビットの全パターンを表せます。二桁なら8ビット=一バイトの0〜255を00〜FFで表せるため、バイナリーデータの表示に向きます。
16進数はデータを暗号化・圧縮する形式ではなく、同じ数値やバイトを人が読みやすい桁で書く表記です。表示した二文字と、元の一バイトはデータ量もバイト値も別です。

一桁が4ビットに対応する
0〜Fで0000〜1111を表します。
00〜FFで一バイトの全値を表します。
右端から16の0乗、1乗、2乗の位として計算します。
RFC 4648のbase16ではパディングを必要としません。
0〜Fと4ビットの対応
| 16進 | 10進 | 2進4ビット | 16進 | 10進 | 2進4ビット |
|---|---|---|---|---|---|
| 0 | 0 | 0000 | 8 | 8 | 1000 |
| 1 | 1 | 0001 | 9 | 9 | 1001 |
| 2 | 2 | 0010 | A | 10 | 1010 |
| 3 | 3 | 0011 | B | 11 | 1011 |
| 4 | 4 | 0100 | C | 12 | 1100 |
| 5 | 5 | 0101 | D | 13 | 1101 |
| 6 | 6 | 0110 | E | 14 | 1110 |
| 7 | 7 | 0111 | F | 15 | 1111 |
位取りで十進数へ直す
16進2Fは、2 × 16 + 15なので十進47です。右端一桁は0〜15、その左は16個単位、その左は256個単位として足します。
二進数からは右から4ビットずつ区切り、各グループを一桁へします。1010 1111はAFです。桁不足は左へ0を補います。
接頭辞と接尾辞はデータの一部とは限らない
プログラムでは0x2F、URLのパーセントエンコーディングでは%2F、色では#2F...のように文脈別の印を使います。0xや#は16進数字ではありません。
ツールによって末尾h、バックスラッシュエスケープ、空白区切り等もあります。入力欄が接頭辞を受けるか、何バイト単位か、符号付きかを確認します。
A〜Fの大小文字
数値表記ではAFとafは同じ値です。RFC 4648のBase16デコーダーは大文字小文字を受けられますが、生成器は上位仕様の正規表記に従います。
ハッシュ文字列、色コード、URL等では比較前に仕様どおり正規化します。大小文字以外の余分な区切り記号や全角文字まで勝手に許しません。
先頭0は値を変えず、幅を示す
数値として0AとAは同じ10です。しかしバイトダンプでは常に二桁にして一バイト境界を示します。16ビットフィールドなら四桁、256ビットダイジェストなら64桁というように幅を保ちます。
先頭0を落とした可変長文字列を連結すると、どこがフィールド境界か分からなくなります。プロトコルの固定幅または長さを維持します。
16進文字列と元バイトを区別する
一バイト値41はASCII文字Aです。一方、文字列"41"をASCII/UTF-8で保存すると、文字4のバイト 34と文字1のバイト 31という二バイトになります。
「16進を送る」が生のバイト列かBase16文字列かをAPIで明示します。テキスト化すると一バイトが二文字になり、容量は元バイナリーの二倍です。
エンディアンはバイトの順序に現れる
16ビット値1234をビッグエンディアンで保存すればバイト列12 34、リトルエンディアンなら34 12です。16進ダンプはメモリー上のバイト順を左から表示します。
各バイトの二桁12まで21へ反転するわけではありません。数値全体の表記と、メモリー上のバイト列の表示を分けます。
使われる場所
メモリーアドレス、パケットダンプ、MACアドレス、IPv6、RGB色、Unicode符号位置、ファイル識別用のマジックナンバー、SHA-256 ダイジェスト等で使います。どれも16進という表記は共通でも、区切り・ビット幅・バイト順・意味は別です。
16進数は4ビットを一桁で表し、一バイトを二桁で読める記数法です。接頭辞・幅・大小文字・生のバイト列とBase16文字列・エンディアンを文脈ごとに区別します。
base16 alphabet・4bit一桁・一byte二桁・大小文字:RFC 4648 Section 8