16進数とは
16進数(ヘキサ、HEX)は16を基数とする数の表し方です。0 から 9 の数字と A から F のアルファベットを使い、A は10、F は15を意味します。16進数2桁で0から255までの値を表せるので、ちょうど1バイト分になります。そのため、生のデータをコンパクトに、読みやすく表示する方法として使われています。
16進数は、メモリダンプ、ネットワークのパケットキャプチャ、ファイルのシグネチャ、カラーコード、ソースコードのエスケープシーケンス、エラーログなどで目にします。そうしたバイトをテキストに戻すと、データの中身がわかることがよくあります。
16進数テキスト変換の使い方
16進数をテキストに。 左側の「16進数」欄に16進数を貼り付けます。右側の「テキスト」欄にデコードされたテキストが表示されます。よくある区切り文字は無視されるので、次のような形式をそのまま貼り付けられます。
- スペース区切りのバイト:
48 65 6c 6c 6f - 区切りなしの文字列:
48656c6c6f - C言語風の接頭辞:
0x48 0x65 0x6c - エスケープシーケンス:
\x48\x65\x6c - コロンやカンマで区切ったバイト:
48:65:6c:6c:6f
テキストを16進数に。 右側の「テキスト」欄に入力します。左側に16進数が表示されます。たとえば 日本語 は e6 97 a5 e6 9c ac e8 aa 9e になります。
16進数の形式で、16進数の書き方を選べます。
- スペース区切り:48 65 6c:読んだり比べたりするとき向け
- 連結:48656c:コンパクトな保存やハッシュ形式の文字列向け
- 接頭辞付き:0x48 0x65:C、C++ などのコード向け
- エスケープ:\x48\x65:Python、JavaScript、シェルスクリプトの文字列リテラル向け
「A から F を大文字に」をオンにすると、アルファベットが大文字で書かれます。「コピー」でどちらの欄も取り出せ、「クリア」で両方の欄が空になります。
仕組み
デコードするときは、まず区切り文字を取り除き、16進数の文字だけが残っていて桁数が偶数であることを確認します。次に、2桁ずつを1バイトとして読み取り、そのバイトを UTF-8 のテキストとしてデコードします。エンコードはその逆です。テキストを UTF-8 のバイトに変換し、各バイトを2桁の16進数にします。
16進数1桁は4ビットを表します。バイト 48 は 4 × 16 + 8 = 72 で、大文字の H のコードです。
変換例
| 16進数 | テキスト |
|---|---|
41 |
A |
48 69 21 |
Hi! |
48 65 6c 6c 6f |
Hello |
48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 |
Hello, World! |
63 61 66 c3 a9 |
café |
e2 82 ac |
€ |
同じテキストを各出力形式で表すと次のようになります。
| 形式 | café |
|---|---|
| スペース区切り | 63 61 66 c3 a9 |
| 連結、大文字 | 636166C3A9 |
| 接頭辞付き | 0x63 0x61 0x66 0xc3 0xa9 |
| エスケープ | \x63\x61\x66\xc3\xa9 |
よく使う16進数の値
| 16進数 | 文字 | 16進数 | 文字 |
|---|---|---|---|
20 |
スペース | 30 |
0 |
0a |
改行(LF) | 41 |
A |
0d |
復帰(CR) | 61 |
a |
09 |
タブ | 7e |
~ |
ヒントと制限
- 意味のない記号が出る場合、たいていはデータがテキストではありません。 画像、圧縮ファイル、暗号化されたデータは、奇妙な記号や置換文字になります。これは想定どおりの動作です。
- 数値のバイト順を確認しましょう。 このツールは、バイトを与えられた順に読みます。メモリダンプ内の複数バイトの数値はリトルエンディアンで保存されていることが多いため、右から左へ読んでください。
- 16進数のカラーコードはテキストではありません。
#ff8800は赤・緑・青の強さを表していて、文字ではありません。 - Shift_JIS のデータは正しく読めません。 このツールはバイトを UTF-8 として読みます。古い日本語のファイルなどに多い Shift_JIS や EUC-JP のバイトは、文字化けや置換文字になります。
- 16進数は暗号化ではありません。 バイトを別の書き方で表しているだけです。
そのほかの16進数変換方法
コマンドライン。 Linux と macOS では、xxd -p でファイルを16進数だけの形にし、xxd -r -p で元に戻せます。echo -n Hello | xxd -p を実行すると 48656c6c6f と表示されます。
Python。 bytes.fromhex('48656c6c6f').decode() は Hello を返し、'Hello'.encode().hex() は 48656c6c6f を返します。
JavaScript(Node)。 Buffer.from('48656c6c6f', 'hex').toString() は Hello を返します。
Excel。 ASCII の1バイトなら、=CHAR(HEX2DEC("48")) で H が返ります。逆方向は =DEC2HEX(72) です。
関連ツール
同じバイトを0と1で見るには、2進数翻訳ツールを使ってください。UTF-8 エンコードツールでは、各文字をコードポイントやバイトと一緒に確認できます。データが16進数ではなく Base64 の場合は、Base64 デコーダーを使ってください。