浮動小数点数とHex表現の変換
浮動小数点数を16進数バイト表現に変換する方法とその逆を学びます。バイナリプロトコル、ファイル形式、メモリダンプのデバッグに不可欠。
Conversion
Decimal Value
42.0
Float32 Hex
0x42280000
Float64 Hex
0x4045000000000000
詳細な説明
10進浮動小数点値とその16進数バイト表現の間の変換は、バイナリデータのデバッグ、メモリダンプの検査、またはバイナリプロトコルの実装時の一般的なタスクです。
Float32からhexへ — 42.0のステップバイステップ:
- 42をバイナリに変換:
101010.0 - 正規化:
1.01010 x 2^5 - 符号 = 0、指数 = 5 + 127 = 132 =
10000100、仮数 =01010000...0 - 完全なバイナリ:
0 10000100 01010000000000000000000 - 4ビットニブルにグループ化:
0100 0010 0010 1000 0000 0000 0000 0000 - ニブルをhexに変換:
4 2 2 8 0 0 0 0 - 結果:
0x42280000
Hexからfloatへ — 0x42280000のステップバイステップ:
- hexをバイナリに変換:
0100 0010 0010 1000 0000 0000 0000 0000 - フィールドの抽出: 符号 =
0、指数 =10000100= 132、仮数 =01010000...0 - 実際の指数 = 132 - 127 = 5
- 有効数字 = 1.01010(バイナリ)= 1 + 0.25 + 0.0625 = 1.3125
- 値 = (-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への変換は、ネットワークプロトコル開発、バイナリファイル形式の実装、組み込みシステムのデバッグ、リバースエンジニアリング、および異なるプラットフォームや言語間での浮動小数点データの正しいシリアル化の検証に不可欠です。