【问题标题】:Convert Bytes to Floating Point Numbers?将字节转换为浮点数?
【发布时间】:2010-09-05 13:07:04
【问题描述】:

我有一个必须解析的二进制文件,并且我正在使用 Python。有没有办法把 4 个字节转换成单精度浮点数?

【问题讨论】:

    标签: python floating-point


    【解决方案1】:
    >>> import struct
    >>> struct.pack('f', 3.141592654)
    b'\xdb\x0fI@'
    >>> struct.unpack('f', b'\xdb\x0fI@')
    (3.1415927410125732,)
    >>> struct.pack('4f', 1.0, 2.0, 3.0, 4.0)
    '\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@'
    

    【讨论】:

    • 这仅适用于 4 或 8 字节浮点数。 10 字节的浮点数呢?
    • 我同意@dplass,其他花车呢。而且,为什么这个字符串的末尾有一个逗号?
    • @startec 问题是关于 4 字节浮点数。哪个字符串以逗号结尾?只有来自struct.unpack 的元组有逗号。
    • @PetrKrampl 精度为 C float(单,4 字节)和 C double(双,8 字节)。 Python float 真的是 C double。无论将 3.141592654 存储为 C double 的准确性如何,当它转换为 C float(通过 struct.pack)然后返回 C double(Python 将 4 字节提取为 C float 然后将结果转换回 C double/Python float)。这适用于所有使用 IEEE754 浮点数的 Python 实现(CPython 可以;无论如何,我不知道任何系统上有任何不符合 IEEE754 的 Python 实现)。
    • 注意:要查看字节数组的各个字节(用 b' 表示),请使用 list()。例如:list(struct.pack('f', 3.141592654))[219, 15, 73, 64] 返回单个字节的列表。这非常方便。
    【解决方案2】:

    只是一点点补充,如果你想要一个浮点数作为 unpack 方法的输出而不是一个元组,只需编写

    >>> [x] = struct.unpack('f', b'\xdb\x0fI@')
    >>> x
    3.1415927410125732
    

    如果你有更多的浮点数,那么就写

    >>> [x,y] = struct.unpack('ff', b'\xdb\x0fI@\x0b\x01I4')
    >>> x
    3.1415927410125732
    >>> y
    1.8719963179592014e-07
    >>> 
    

    【讨论】:

    • 或者您可以参考 RHS 上的列表位置x = struct.unpack('f', b'\xdb\x0fI@')[0]
    猜你喜欢
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多