这个时间格式是什么?

逆向工程 文件格式
2021-07-10 09:01:37

我正在对一种文件格式进行逆向工程,其中(在我已经解码的许多其他内容中)正在存储文件的“长度”。它以分钟:秒的形式显示给用户。通过更改文件并将其加载到程序中进行了一些试验,我收集了以下可能性:

Original:
5d42: 0:55

Altered:
5240: 0:03
0000: 0:00
003f: 0:00
0040: 0:02
0041: 0:18
0042: 0:32
0043: 2:08
0044: 8:32
0045: 34:08
1045: 38:24
0046: 136:32
0047: 564:08
0048: 2184:32
0049: 8738:08
004a: 34952:32
004b: invalid
004c: 559240:33
004d: 2236962:15
004e: 8947849:00
004f: 35791396:00
0050: 143165584:00
0051: 572662336:00
0052: 2290649344:00

0142: 0:32
0242: 0:32
0342: 0:32
0442: 0:33
0542: 0:33
0642: 0:33
0742: 0:33
0842: 0:34
0942: 0:34
0a42: 0:34
0b42: 0:34
0c42: 0:35
0d42: invalid
0e42: 0:35
0f42: 0:35
1042: 0:36
1142: 0:36

我的猜测是这是某种浮点数,但我的技能太有限,不知道是哪种浮点数。我知道文件中的所有其他数字都存储为 little-endian。

有没有人有任何线索?

1个回答

这看起来很像IEEE754格式,我假设你的两个字节时间码中的每一个都前面有两个零字节,这构成了一个 4 字节(32 位)值。

您可以使用公式计算指数

exponent=(byte2 * 2 - 127)

和以秒为单位的值使用

value=2^exponent*(1+byte1/128)

假设byte1的高位是clear的;如果您在 byte1 中设置最高位,您可能会得到一个负值。(如果 byte1 为零,就像在您的大多数示例中一样,值等于指数,因为被乘数为 1)

请注意,您的 值中有一个拼写错误0041,应该是0:08,而不是0:18,并且您在检查004b时可能犯了一个错误,应该是8388608秒或139810:08分钟。