反向工程专有浮点数编码

4
我正在尝试分析一些没有规范的旧二进制格式。我发现有一个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

我能够为任何可能有用于分析的字节组合提供浮点值。
请帮助我找出将这些原始字节转换为浮点数的公式。

00 00 00 4301 00 00 4302 00 00 4300 00 00 44的浮点值分别是多少? - Simon Byrne
以下是数值:00 00 00 43 = 0.90372504165607601 00 00 43 = 0.90372514938849602 00 00 43 = 0.90372525712091700 00 00 44 = 3.6149001666243还有一件事,所有数据都按照文件顺序呈现,可能需要反转以进行分析。 - pliber
@pliber,可能有所帮助的是负操作数的示例,以及非常大和非常小(在数量级上)的示例,以及跨多个连续二进制区间的示例(例如,在[1,2),[2,4),[4,8),[8,16),[16,32))。 - njuffa
@pliber:你能提供一些关于这些值来自哪里的上下文吗?我在想是否存在某种隐式单位转换。 - Mark Dickinson
Mark Dickinson:这些是来自Roche LightCycler 480仪器的荧光读数。我正在分析实验文件,而这个数组是用Base64编码的。为了获取这些浮点值,我需要修改项目文件中的原始字节,将其重新导入LightCycler软件并再次导出。因此,我不确定是否在其中进行了其他转换。 - pliber
1个回答

5
通过对这些值进行排序,可以清楚地看出字节序已经交换(因此1.86281420496466实际上是43 83 EB B8)。
将这些十六进制值绘制成浮点数值后,可以发现在第9位之后线性增长,因此位于10-32位之间的比特似乎是带有隐式前导位(m)的有效数字。
然后,第一位似乎是符号(1表示负数,0表示正数)。
2到9位似乎是偏置指数(e)
该数字的一般形式为:
sign × 2e-134 × 0.903725041656076 × (1 + m/223)
如果偏置指数为零,则该值本身为零。
我不确定为什么会有奇怪的常量存在。
更新:如果乘以 141.636 ,它似乎与IEEE754二进制32匹配,除了处理零(即将亚标准化值刷新为零)。
在Julia中,可以进行如下转换:
julia> reinterpret(UInt32,Float32(1.86281420496466*141.636)) # float to hex
0x4383ebb8

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

对于二进制格式来说,有一点似乎并不合理,那就是1.76..和3.46..应该共享相同的“指数字节”值,即0x43。我在想是否可以在这里使用比2更高的基数。 - njuffa
njuffa: 我会尝试从你在之前评论中提到的范围中生成更多数字。谢谢Simon,我得想一想这个奇怪的常数。我已经检查过了,第一位确实是符号位(1表示负数,0表示正数)。 - pliber
@pliber 我认为查看小整数的编码也会有所帮助。到目前为止,我已经考虑过浮点格式、定点格式和对数数字系统,但似乎没有完全符合的。两个“0”的示例似乎表明可以使用flush-to-zero。 - njuffa
@Simon Byrne: 所以隐式比例因子是sqrt(2)?奇怪。 - njuffa
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - pliber
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接