我正在尝试分析一些没有任何规范的旧二进制格式。我发现有96个浮点数的数组,每个浮点数为4个字节。

我花了很多时间使用不同的十六进制浮动工具,但是没有运气。我找不到任何模式。因此,我怀疑这是某种不同寻常的浮点表示形式,而不是像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

该数字的一般形式为:

符号×2 e -134×0.903725041656076×(1 + m / 223)

如果偏差指数为零,则该值本身为零。

我不确定为什么那里会有一个有趣的常量。

更新:如果乘以141.636,则它看起来确实与IEEE754 binary32相匹配,而不是处理零(即,将次范数刷新为零)。

在Julia中,转换可以通过以下方式完成:

julia> reinterpret(UInt32,Float32(1.86281420496466*141.636)) # float to hex
0x4383ebb8

julia> reinterpret(Float32,0x4383ebb8)/141.636 # hex to float
1.862814204964663

07-24 09:45
查看更多