情報の授業やログに 48 65 6c 6c 6f が出てきたら、まず「16進数で書かれたバイト列かもしれない」と考えます。この例はUTF-8として読むと Hello です。ただし、0〜9とa〜fだけで書かれていることは手掛かりであり、文字列だと断定する根拠にはなりません。
HexとUTF-8は役割が違う
Hex(16進表記)は、1バイトの値を 00〜ff の2桁で表します。例えば 48 は10進数では72です。UTF-8では、このバイトが英字 H に対応します。
変換の途中では、次の3つを分けて考えると混乱しません。
| 段階 | Helloの例 | 意味 |
|---|---|---|
| Hex表記 | 48 65 6c 6c 6f |
人が読める形で記したバイトの値 |
| バイト列 | 5バイト | 実際のデータ |
| UTF-8の文字列 | Hello |
バイト列を文字として解釈した結果 |
16進数の 41 を整数として10進数にするなら65です。バイト 41 を文字として読むなら A です。前者は進数変換、後者はHex・文字列変換を使います。
Helloを復元する手順
- Hex・文字列変換を開き、変換方向を「Hex → UTF-8」にします。
48 65 6c 6c 6fを入力し、「変換する」を押します。- 出力が
Hello、バイト数が5であることを確認します。 - 方向を「UTF-8 → Hex」に切り替え、
Helloを入力すると、元のバイト表記へ戻せます。
大文字の 6C と小文字の 6c は同じ値です。Tools Hubでは区切りなしの 48656c6c6f も使えます。半角スペース・改行・タブは区切りとして除かれますが、全角スペースやカンマは除かれません。
日本語1文字が3バイトになる例
猫 をUTF-8へ変換すると e7 8c ab の3バイトです。文字数1、バイト数3、区切りを除くHexの桁数6は、それぞれ違う数を表しています。
UTF-8では文字により必要なバイト数が異なります。そのため、Hexを2桁ずつ取り出して各バイトを独立した文字として読む方法では、日本語を正しく復元できません。まずバイト列全体へ戻してからUTF-8として読みます。
また、Unicodeのコードポイント U+732B と、UTF-8のバイト列 e7 8c ab は別の表記です。732b をそのままUTF-8のバイト列として入力しても、猫 にはなりません。
変換できないときの確認表
| 入力・症状 | 原因 | 確認すること |
|---|---|---|
486 |
Hexが奇数桁で1バイトを作れない | コピー漏れがないか原文と照合する |
0x48 0x65 |
ツールが0x接頭辞を受け付けない | 各バイトの0xを除き 48 65 にする |
48,65 |
カンマはHexの数字ではない | 区切りを半角スペースにする |
ff |
Hexとしては有効でもUTF-8として無効 | 元データの文字コードやファイル形式を確認する |
| 出力が読めるが意味不明 | 変換順序や想定形式が違う可能性 | 問題の指示と元データを確認する |
このツールは不正なUTF-8を � に置き換えて成功扱いにせず、警告とHexのバイト列を表示します。Shift_JISの文章、画像、圧縮データなどを入力した場合は、対応する形式を扱えるツールが必要です。
変換結果を確かめる
元の文字列を手元に残し、試した変換と結果を1段階ずつ記録します。復元結果がBase64らしく見えた場合も、すぐ正解と決めず、Base64の仕組みと照合してください。
Hex・文字列変換ツールに e7 8c ab を入力し、「猫」に戻ることと、UTF-8では3バイトになることを確かめてください。