gpt4 book ai didi

binary - 这是什么浮点格式?

转载 作者:行者123 更新时间:2023-12-05 00:00:01 25 4
gpt4 key购买 nike

我想弄清楚如何读取历史二进制数据文件。我相信它来自较旧的 32 位 Solaris 系统。我正在查看我认为包含 32 位浮点数(不是 IEEE 浮点数)的文件部分。格式似乎是(作为十六进制转储):

xx41 xxxx
xx42 xxxx

这些位置中的 41 和 42 通过浮点数一致出现。恐怕我没有任何其他信息可以添加到此。所以我的问题的第一部分是,这是什么格式?如果不能直接回答第一部分,那么列出可能的可能性会很好。最后,您建议如何确定这是什么格式?谢谢您的意见。

最佳答案

这可能是 PDP-11 格式吗?对我来说,赠品是第二个字节大部分是恒定的,这表明浮点格式的指数最终出现在第二个字节而不是第一个字节中(正如您对大端机器所期望的那样)或最后(对于小端机器)。 PDP-11 因其有趣的浮点数和整数字节顺序而臭名昭著。查看靠近底部的 Material Floating-Point Formats页。
41 的值和 42似乎与大致单位幅度的正值一致:PDP-11 格式的指数偏差似乎是 128 ,因此对于不寻常的字节顺序,我希望您列出的第二个字节包含符号和指数的最高 7 位;这将使 41 的第二个字节的无偏指数为 2 或 3,具体取决于第 8 个指数位(应显示为第一个字节的 MSB)。

另见 this page有关 PDP-11 格式的简要说明。

[编辑] 这里有一些 Python 代码,用于从您描述的形式的 4 字节字符串转换为 Python 浮点数,假设 4 字节字符串表示 PDP-11 格式的浮点数。

import struct

def pdp_to_float(xs):
"""Convert a 4-byte PDP-11 single-precision float to a Python float."""

ordered_bytes = ''.join(xs[i] for i in [1, 0, 3, 2])
n = struct.unpack('>I', ordered_bytes)[0]

fraction = n & 0x007fffff
exponent = (n & 0x7f800000) >> 23
sign = (n & 0x80000000) >> 31

hidden = 1 if exponent != 0 else 0
return (-1)**sign * 2**(exponent-128) * (hidden + fraction / 2.0**23)

例子:
>>> pdp_to_float('\x00\x00\x00\x00')
0.0
>>> pdp_to_float('\x23\x41\x01\x00')
5.093750476837158
>>> pdp_to_float('\x00\x42\x00\x00')
16.0

关于binary - 这是什么浮点格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10931081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com