テキストから16進数へ:トレースの中でバイトが見せる顔
この変換でわかること
テキストをUTF-8で符号化し、各バイトを2桁の16進数として出力します。これはパケットキャプチャやメモリビューア、プロトコルのログで使われる表記そのものなので、この変換は人が打ち込む文字とツールが表示する値の間の翻訳だと言えます。
1バイトは必ず2桁
1バイトが持てる値は0から255までで、16進数の2桁はちょうどその範囲を00からFFまで覆います。この対応は決して崩れないため、16進ダンプは目で追えます。2桁を数えればバイト数が分かり、左端のオフセット欄が今どの位置を見ているかを教えてくれます。
テキストと16進数の変換表
短い文字列とその16進数のバイト値です。記号や数字はASCIIの値として1組に収まり、ラテン文字の外側にある文字は複数の組に広がります。
| テキスト | 16進数 |
|---|---|
| A | 41 |
| Hi | 48 69 |
| OK | 4F 4B |
| 123 | 31 32 33 |
| ! | 21 |
| Go | 47 6F |
キャプチャの中から文字列を探す
パケットキャプチャを読める文字列で検索しても、うまくいかないことがほとんどです。回線を流れているのはバイトで、打ち込んだのは文字だからです。探したい文字列を16進数にしておけば、検索すべき並びがそのまま得られます。アクセント付きの名前で検索が失敗し、外した検索が成功する理由も、符号化された長さが違う点にあります。
区切り文字に注意する
本ツールは読みやすさのためバイトを空白で区切りますが、キャプチャやURLでは桁が連続していたりパーセント記号が使われたりします。検索するときは空白を取り除くか、使うツールの区切りに合わせてください。見た目が同じでも、隙間のせいだけで一致しないことがあります。
よくある質問
テキストから16進数へ手で変換するには?
各文字のUTF-8のバイト値を調べ、2桁の16進数として書きます。Hiなら48と69です。ASCIIの範囲外の文字は符号位置ではなくバイト値が必要で、1文字が複数のバイトになることがあります。
16進数の出力と2進数の出力は何が違いますか?
表記以外に違いはありません。どちらも同じUTF-8のバイト列を表しており、16進数は1バイトを2桁、2進数は8桁で書きます。16進数は4分の1の長さで読みやすく、個々のビットを見たいときだけ2進数が向いています。
アクセント付きの文字が2バイトになるのはなぜですか?
UTF-8は元のASCIIの範囲より上の文字を複数バイトで表し、アクセント付きのラテン文字は多くが2バイトになります。これは破損ではなく正常な結果で、1バイトで届く範囲の外にあるというだけのことです。
URLの符号化と同じものですか?
近いですが同一ではありません。パーセントエンコードはUTF-8のバイト列の各2桁の前にパーセント記号を付けたもので、バイト値は本ツールと完全に一致し、違うのは記号だけです。ここで16進数にすれば、そのまま変換できるバイト列が得られます。
出力をバイト配列のリテラルに使えますか?
使えます。並んでいるのはバイト値そのものなので、各2桁に0xを付ければ多くのプログラミング言語のリテラルになります。本ツールは慣習に合わせて大文字で出力しますが、貼り付ける先では小文字でも同じ値として扱われます。