浮動小数点数とHex表現の変換

浮動小数点数を16進数バイト表現に変換する方法とその逆を学びます。バイナリプロトコル、ファイル形式、メモリダンプのデバッグに不可欠。

Conversion

Decimal Value

42.0

Float32 Hex

0x42280000

Float64 Hex

0x4045000000000000

詳細な説明

10進浮動小数点値とその16進数バイト表現の間の変換は、バイナリデータのデバッグ、メモリダンプの検査、またはバイナリプロトコルの実装時の一般的なタスクです。

Float32からhexへ — 42.0のステップバイステップ:

  1. 42をバイナリに変換: 101010.0
  2. 正規化: 1.01010 x 2^5
  3. 符号 = 0、指数 = 5 + 127 = 132 = 10000100、仮数 = 01010000...0
  4. 完全なバイナリ: 0 10000100 01010000000000000000000
  5. 4ビットニブルにグループ化: 0100 0010 0010 1000 0000 0000 0000 0000
  6. ニブルをhexに変換: 4 2 2 8 0 0 0 0
  7. 結果: 0x42280000

Hexからfloatへ — 0x42280000のステップバイステップ:

  1. hexをバイナリに変換: 0100 0010 0010 1000 0000 0000 0000 0000
  2. フィールドの抽出: 符号 = 0、指数 = 10000100 = 132、仮数 = 01010000...0
  3. 実際の指数 = 132 - 127 = 5
  4. 有効数字 = 1.01010(バイナリ)= 1 + 0.25 + 0.0625 = 1.3125
  5. 値 = (-1)^0 x 1.3125 x 2^5 = 1 x 1.3125 x 32 = 42.0

JavaScriptでの変換:

// Floatからhex
function floatToHex(value) {
  const buf = new ArrayBuffer(4);
  new DataView(buf).setFloat32(0, value);
  return '0x' + new DataView(buf).getUint32(0).toString(16).padStart(8, '0');
}

// Hexからfloat
function hexToFloat(hex) {
  const buf = new ArrayBuffer(4);
  new DataView(buf).setUint32(0, parseInt(hex, 16));
  return new DataView(buf).getFloat32(0);
}

認識すべき一般的なhexパターン:

パターン Float32 意味
0x00000000 +0 全ビットゼロ
0x80000000 -0 符号ビットのみセット
0x3F800000 1.0 単位値
0x7F800000 +Infinity 最大指数、ゼロ仮数
0x7FC00000 NaN 最大指数、非ゼロ仮数

エンディアンの重要性:

バイナリファイルやネットワークパケットから浮動小数点数を読み取る場合、バイトオーダーはプラットフォームに依存します。ビッグエンディアン(ネットワークバイトオーダー)は最上位バイトを先に格納します。リトルエンディアン(x86)は最下位バイトを先に格納します。ここに示すhex値はビッグエンディアン順です。

ユースケース

浮動小数点からhexへの変換は、ネットワークプロトコル開発、バイナリファイル形式の実装、組み込みシステムのデバッグ、リバースエンジニアリング、および異なるプラットフォームや言語間での浮動小数点データの正しいシリアル化の検証に不可欠です。

試してみる — IEEE 754 Inspector

フルツールを開く