進数を変えても整数は同じ
10進数の 65、2進数の 1000001、16進数の 41 は、同じ非負整数の3種類の表記です。基数は数の書き方を変えますが、その数が表す値は変えません。10進→2進ツールに 65 を入力し、16進数ツールの結果とも比較しましょう。8ビットの1バイト全体を表示するために先頭のゼロを加えると 01000001 になりますが、表示上の選択で整数の値は変わりません。2進→10進で数値表記を元に戻せます。識別子、ビットマスク、個数など、元データが整数と分かっている場合に適した手順です。
テキストには文字コードが必要
文字 A はテキストの1文字です。UTF-8 では1バイトの 0x41 で表し、そのビットパターンは 01000001 です。UTF-8 の ASCII 文字はそのバイト値を使うため、ここでは上の整数の例と偶然一致します。しかし文字列「65」には 6 と 5 の2文字があり、UTF-8 バイト列は 0x36 と 0x35 です。したがって、数値 65 を数値変換ツールに入れる場合と、文字列「65」をテキスト→バイトのツールに入れる場合では答える質問が違います。元データが数値か、そのまま入力された文字かを確認してください。
- 整数 65₁₀ = 41₁₆ = 1000001₂
- 文字 A → UTF-8 バイト 41₁₆
- テキスト「65」→ UTF-8 バイト 36 35₁₆
アクセント付き文字で違いを見る
文字 é は UTF-8 で C3 A9 という2バイトで表されます。Unicode コードポイントは U+00E9 ですが、正規化形式が違えば e の後に結合アクセントを置いて表すこともできます。テキスト→2進数ツールは、目に見える1文字に対して1組ではなく、合成形の UTF-8 で8ビットの組を2つ表示する場合があります。文字のコードポイントを1バイトだと思い込むと、情報が失われたり誤った出力になったりします。テキストプロトコルの不具合を調べる際は、整数用の10進→16進ツールではなく、UTF-8 のバイト表示を使ってください。
データの境界と区切りを確認する
2進数の文字列 0100000101000010 は、01000001 と 01000010 の2バイトとして読むと、UTF-8 では AB になります。文字コードと区切り規則が分からなければ、裸のビット列の解釈は曖昧です。10進数の 4142 は16進数の 4142 と同じ値ではなく、どちらも自動的に2バイトのテキストを意味するわけではありません。16進数の接頭語 0x や、バイト間の明示的な空白があれば記録を読みやすくできます。貼り付けたデータをデコードする前に元の区切りを保ち、その形式で先頭のゼロに意味があるか確認してください。
目的に合う検算を選ぶ
数値を変換するときは、元の整数とその基数を記録し、変換後に対応する逆方向の数値ツールで元へ戻して確かめます。テキストでは、文字と必要ならその正規化形式、UTF-8 のバイト列を記録し、対応するテキストツールでバイト列を復号してください。A、65、é を別々のテスト入力として試します。コピーした出力が予想外に長ければ、バイト数を数え、入力に空白、改行、ASCII 以外の文字が含まれていないか調べます。二つの手順は同じバイト値に至る場合がありますが、その値をどう解釈するかは元データの仕様で決まります。