逆向工程专有浮点数编码
Reverse engineering proprietary floating point number encoding
我正在尝试分析一些没有任何规范的旧二进制格式。我发现有一个由 96 个浮点数组成的数组,每个 4 个字节长。
我花了很多时间使用不同的 hex<->float 工具,但运气不好。我找不到任何模式。所以我怀疑这是某种不寻常的浮点表示,而不是像 IEEE-754 这样的标准。
下面是字节映射到浮点值的一长串示例:https://gist.github.com/anonymous/e67dd27706ba1f289a895fef70399dc9
几个例子:
80 00 00 80 = 0
00 FF 00 00 = 0
B8 EB 83 43 = 1.86281420496466
F8 AF 86 43 = 1.9018805660946
7B C2 F2 43 = 3.42793766176755
37 43 F5 43 = 3.46327992859723
6A 4D 03 44 = 3.70816455369089
26 C6 0A 44 = 3.919173581123
AF C3 79 43 = 1.76342447568475
我能够为可能对分析有用的任何字节组合提供浮点值。
你能帮我弄清楚如何将这些原始字节转换为浮点数的公式吗?
通过对值进行排序,很明显字节序已经交换(所以 1.86281420496466 实际上是 43 83 EB B8
.
根据浮点值绘制这些十六进制值表明它在第 9 位之后是线性的,因此第 10-32 位似乎是带有隐式前导位的有效数字 (m
)。
然后第一位似乎是符号(1 表示负数,0 表示正数)。
第 2 位到第 9 位似乎是有偏差的指数 (e
)
那么数字的一般形式是:
符号×2e
-134×0.903725041656076×(1+m
/223)
如果偏置指数为零,则值本身为零。
我不确定为什么那里有一个有趣的常数。
更新:它似乎与 IEEE754 binary32 相匹配,如果乘以 141.636
,除了对零的处理(即,它将次正规刷新为零)。
在 Julia 中,转换可以这样完成:
julia> reinterpret(UInt32,Float32(1.86281420496466*141.636)) # float to hex
0x4383ebb8
julia> reinterpret(Float32,0x4383ebb8)/141.636 # hex to float
1.862814204964663
我正在尝试分析一些没有任何规范的旧二进制格式。我发现有一个由 96 个浮点数组成的数组,每个 4 个字节长。
我花了很多时间使用不同的 hex<->float 工具,但运气不好。我找不到任何模式。所以我怀疑这是某种不寻常的浮点表示,而不是像 IEEE-754 这样的标准。
下面是字节映射到浮点值的一长串示例:https://gist.github.com/anonymous/e67dd27706ba1f289a895fef70399dc9
几个例子:
80 00 00 80 = 0
00 FF 00 00 = 0
B8 EB 83 43 = 1.86281420496466
F8 AF 86 43 = 1.9018805660946
7B C2 F2 43 = 3.42793766176755
37 43 F5 43 = 3.46327992859723
6A 4D 03 44 = 3.70816455369089
26 C6 0A 44 = 3.919173581123
AF C3 79 43 = 1.76342447568475
我能够为可能对分析有用的任何字节组合提供浮点值。
你能帮我弄清楚如何将这些原始字节转换为浮点数的公式吗?
通过对值进行排序,很明显字节序已经交换(所以 1.86281420496466 实际上是 43 83 EB B8
.
根据浮点值绘制这些十六进制值表明它在第 9 位之后是线性的,因此第 10-32 位似乎是带有隐式前导位的有效数字 (m
)。
然后第一位似乎是符号(1 表示负数,0 表示正数)。
第 2 位到第 9 位似乎是有偏差的指数 (e
)
那么数字的一般形式是:
符号×2e
-134×0.903725041656076×(1+m
/223)
如果偏置指数为零,则值本身为零。
我不确定为什么那里有一个有趣的常数。
更新:它似乎与 IEEE754 binary32 相匹配,如果乘以 141.636
,除了对零的处理(即,它将次正规刷新为零)。
在 Julia 中,转换可以这样完成:
julia> reinterpret(UInt32,Float32(1.86281420496466*141.636)) # float to hex
0x4383ebb8
julia> reinterpret(Float32,0x4383ebb8)/141.636 # hex to float
1.862814204964663