我正在尝试逆向工程某些旧文件格式(Cinema4D旧版本),但找不到规范说明。
在这种文件格式中,我已经发现浮点数值被存储为四个字节,但它们似乎不是正常的IEEE格式,这不是大小端问题。最近我花了很多时间使用十六进制<->浮点数转换工具来解决这个问题。
以下是一些样本值:
在这种文件格式中,我已经发现浮点数值被存储为四个字节,但它们似乎不是正常的IEEE格式,这不是大小端问题。最近我花了很多时间使用十六进制<->浮点数转换工具来解决这个问题。
以下是一些样本值:
0 = 00 00 00 00
1 = 80 00 00 41
2 = 80 00 00 42
4 = 80 00 00 43
8 = 80 00 00 44
0.25 = 80 00 00 3F
16384 = 80 00 00 4F
根据上面两行的观察,从3楼到4楼似乎有些东西环绕在这里。
1.5 = C0 00 00 41
2.5 = A0 00 00 42
-1 = 80 00 00 C1
-1.5 = C0 00 00 C1
-2 = 80 00 00 C2
-3 = C0 00 00 C2
以下是一些观察结果:
- 将最后一个字节加1,会使值翻倍
- 如果最后一个字节的高位被设置,那么这个数是负数
- 第一个字节对于非整数值有影响
虽然有一些明显的模式,还有一些指数/尾数的运算,但我还没有能够找出规律。也许我甚至错过了一些显而易见的东西,它可能是正常的IEEE格式?解决尾数/指数等需要多少比特位不是问题(在上面的例子中,两个中间字节为零),首先我需要找出计算浮点值的公式。
[0.5,1.0)
范围内给出的有效数字,最后一个字节的最高位是符号位,剩余的7位给出超额64指数。然而,这与我所知道的任何常见浮点格式都不匹配(不是IEEE 754,不是VAX,不是IBM,不是Cray,...)。 - Mark Dickinson