文字列・バイト列・HEXとは?関係をわかりやすく解説
コンピューターが直接保存するのは文字そのものではなく数値の並びです。文字コードが文字をバイト列へ変え、その値を読みやすく表したものがHEXです。
この記事の要点
- 文字コードは、文字とバイト列を対応付ける規則です。
- HEXは1バイトを通常2桁で表せるため、バイト列の確認に向いています。
- 同じ文字でも文字コードが変わればHEXが変わる場合があります。
文字列・文字コード・バイト列・HEXの関係
画面に見える「A」や「あ」は文字列です。保存や通信を行うときは、UTF-8やShift_JISなどの文字コードに従って数値へ符号化されます。その結果として得られる数値の並びがバイト列です。
文字列 → 文字コードで符号化 → バイト列 → 16進数で表示 → HEXHEX(hexadecimal)は16進数という数値の表し方で、0〜9とA〜Fを使います。1バイトの範囲0〜255を00〜FFの2桁で表せるため、バイト列の表示に便利です。
例:AをHEXで表す
英字の「A」はUnicodeでU+0041です。UTF-8では1バイトの01000001として符号化されます。これを16進数へ直すと41です。
文字列:A
UTF-8のバイト列:01000001
HEX:41
ここで重要なのは、41自体が文字ではないことです。「UTF-8として復号する」という条件があって初めて「A」に戻せます。
日本語は複数バイトになる
UTF-8ではASCII範囲の英数字を1バイト、日本語のひらがなや漢字の多くを3バイトで表します。たとえば「あ」はUTF-8でE3 81 82です。
| 文字 | UTF-8のHEX | バイト数 |
|---|---|---|
| A | 41 | 1 |
| 1 | 31 | 1 |
| あ | E3 81 82 | 3 |
| 日 | E6 97 A5 | 3 |
文字化けが起こる理由
文字列をUTF-8でバイト列にしたのに、Shift_JISとして読み戻すと、同じ値を別の規則で解釈してしまいます。これが文字化けの代表的な原因です。HEXが分かれば元のバイト列を変えずに確認できるため、どの段階で解釈がずれたかを調べやすくなります。
HEX表示の主な用途
- APIやソケット通信の送受信データを確認する
- ファイルの内容や先頭のマジックナンバーを調べる
- 文字化けしたデータの文字コードを切り分ける
- ログに出力されたバイト列を文字列へ戻す
- エスケープ表記や区切り付きHEXを整形する
よくある質問
HEXは文字コードですか?
いいえ。HEXは数値を16進数で表す記法です。文字コードで得られたバイト値を見やすく表示するために使われます。
1文字は必ず1バイトですか?
必ずしも1バイトではありません。UTF-8ではASCII文字は1バイト、日本語の多くは3バイトです。
文字化けはなぜ起こりますか?
符号化に使った文字コードと、復号時に選んだ文字コードが一致しない場合などに起こります。