テキストを 16 進数に変換

メモリダンプを読む、プロトコルが実際に何を送出したのか確かめる、CTF の問題をほどく。遅かれ早かれ、文字列の裏側にあるバイト列が必要になります。テキストを貼り付ければ、この変換ツールが 1 バイトずつ 16 進数にして返します。hexdump のようにスペースで区切る形式(48 65 6c 6c 6f)でも、切れ目なくつなげた形式(48656c6c6f)でも構いません。モードを切り替えれば逆方向になり、貼り付けた 16 進数が読めるテキストに戻ります。

変換ツールの動き

  1. 1

    方向を選ぶ

    テキストから 16 進数は入力を符号化し、16 進数からテキストは文字に戻します。

  2. 2

    区切りを選ぶ

    符号化時はバイト間に半角スペースを 1 つ入れるか、まったく入れないか。選択肢はこの 2 つです。

  3. 3

    入力を貼り付ける

    テキストは UTF-8 として読まれます。16 進数は 0x や \x の接頭辞、カンマ、スペース、改行つきでも構いません。自動で取り除かれます。

  4. 4

    変換してコピーする

    結果は下にコピーボタンつきで表示されます。ファイルのダウンロードはありません。

なぜ 10 進数ではなく 16 進数なのか

16 進数の 1 桁はちょうど 4 ビットを表すので、2 桁でちょうど 1 バイトになります。例外はありません。10 進数では値がまだ収まるかどうかを計算して確かめる必要がありますが(128 は範囲内か、256 はどうか)、16 進数はそれを見せてくれます。00 が最小のバイト、ff が最大のバイトで、その間のどのバイトも幅は 2 文字です。この桁のそろい方こそ、メモリダンプ、パケットキャプチャ、ファイルシグネチャ、カラーコードが 16 進数で書かれる理由です。

このツールが実際に出力するもの

  • 必ず小文字。 符号化側は 6c と書き、6C とは書きません。16 進数は大文字と小文字を区別しないので情報は失われませんが、出力先の書式が大文字を求めるなら、大文字小文字を変換するツールを通してください。
  • 必ず 1 バイト 2 桁。 タブ文字は 9 ではなく 09 です。バイトの境目を数えられるようにするためです。
  • スペースか、なしか。 区切りはこの 2 つだけです。符号化側で 0x や \x の接頭辞が付くことはないので、C や Python のエスケープ文字列が必要なら手元のエディタで補ってください。
  • 一貫して UTF-8。 テキストは文字数ではなくバイト数で数えられます。

16 進数と Unicode

H は UTF-8 で 1 バイトなので 48 になります。素の ASCII を外れる文字はそれ以上を使います。

文字 UTF-8 の 16 進数 バイト数
A 41 1
é c3 a9 2
€ e2 82 ac 3
🚀 f0 9f 9a 80 4

したがって Hello は 48 65 6c 6c 6f になり、5 文字で 5 バイトです。一方 café は 63 61 66 c3 a9 になり、4 文字なのに 5 バイトです。é が 2 バイト必要だからです。日本語はさらに大きく、ひらがな・カタカナ・漢字はいずれも 3 バイトが基本で、たとえば「あ」だけで e3 81 82 の 3 組になります。短い文字列なのに思ったより 16 進数の組数が多いときは、たいていこれが理由です。

復号側が受け付ける書き方

次のどれを貼り付けても Hello が返ります。

  • 48 65 6c 6c 6f、hexdump 形式
  • 48656c6c6f、区切りなしの素の並び
  • 0x48656c6c6f、整数リテラル形式
  • \x48\x65\x6c\x6c\x6f、C と Python のエスケープ
  • 48,65,6C,6C,6F、カンマ区切りで大文字小文字が混ざっていても可

接頭辞、カンマ、スペース、タブ、改行は復号前に取り除かれます。それ以外は取り除かれません。48-65 のハイフン、カラーコードの前の #、f より後ろのアルファベットは復号を止めますし、桁数が奇数のときも同じです。半バイトは文字になれないからです。こうした場合、ツールは中途半端な結果を推測するよりも、何も返さないほうを選びます。出力欄が空のままなら、そこを疑ってください。

16 進数のカラーコードは同じ表記でも中身が違う

#ff8800 も同じ 16 進数の体系ですが、この 3 バイトが表しているのは文字ではなく赤・緑・青の各チャンネルです。# を外してここで復号すると、読めるテキストにならない 3 バイトの生データが返ってきます。その用途にはカラーピッカーをお使いください。

よくある質問

同じです。16 進数と base16 は同一の体系を指す 2 つの呼び名で、いずれも 16 個の数字(0 から 9 と a から f)を使い、1 つが 4 ビットを担います。

このツールではできません。符号化側は常に小文字で書きます。16 進数は大文字と小文字を区別しないため 4f と 4F は同じバイトです。書式の都合で大文字が必要なら、任意の大文字小文字変換ツールを通してください。復号側はどちらの書き方も問題なく読みます。

復号側は、0x や \x の接頭辞、カンマ、空白を取り除いたうえで、0 から 9 と a から f の文字が偶数個そろっている場合だけを受け付けます。ハイフン、#、f より後ろのアルファベット、1 桁の欠けがあると入力は無効になり、ツールは誤った結果より空の結果を選びます。桁数を数え、紛れ込んだ記号を探してみてください。

絵文字の多くは Unicode の追加面にあり、UTF-8 では 4 バイトで格納されるためです。素の ASCII 文字は 1 文字 1 バイトのままなので、英字は 1 文字につき 1 組になりますが、日本語はそうなりません。

できません。ここはテキスト入力欄なので、入力または貼り付けできるものを扱います。バイナリデータであれば base64 のほうが小さく、扱いも簡単です。

されます。変換は当社のサーバー上で実行されるため、貼り付けた内容はリクエストとともに送られ、結果が返ってきます。記録するのは操作の種類と選んだオプションだけで、テキストそのものは記録しませんし、応答後にテキストを保存することもありません。本当に秘匿すべき内容には、手元の端末でオフライン動作する変換ツールをお使いください。

関連ツール

このツールは他の言語でも利用できます