【问题标题】:python lightweight solution for typecasting float(64) to bytes用于将 float(64) 类型转换为字节的 python 轻量级解决方案
【发布时间】:2018-02-23 08:09:32
【问题描述】:

我想要一个非常简单的解决方案来显示浮点值(或内存中更多连续的)的原始字节。在我的理解中,这被称为类型转换(以字节为单位读取内存值),不要被误解为转换(读取值并以字节为单位解释)。

最简单的测试似乎是:

import numpy
a=3.14159265
print(a.hex())
# Returns 0x1.921fb53c8d4f1p+1
b=numpy.array(a)
print(b.tobytes())
# returns b'\xf1\xd4\xc8S\xfb!\t@'
# expected is something like 'F1' 'D4' 'C8' '53' 'FB' '21' '09' '40'

但是方法 hex() 以十六进制返回 IEEE FLOAT 表示的解释。第二种方法显示了四个十六进制字节标记\x,但我想知道 float64 应该读取 8 个字节。此外,我想知道其他角色。
我很老的简单 C 我会通过简单地在浮点的内存地址上使用一个无符号整数指针并从该无符号整数“数组”(指针)打印 8 个值来实现这一点。)
我知道,我可以在 python 中使用 C - 但是还有其他简单的解决方案吗?
也许因为它很有趣:我需要该功能将许多大浮点向量保存到数据库中的 BLOB 中。

我认为,类似的问题可以在Correct interpretation of hex byte, convert it to float 中找到,如果可能的话(可显示的字符)它们不会以\x-form 打印。我该如何改变呢?

【问题讨论】:

    标签: python python-3.x typecasting-operator typecast-operator


    【解决方案1】:

    您可以为此使用内置模块struct。如果您有 Python 3.5 或更高版本:

    import struct
    struct.pack('d', a).hex()
    

    它给出:

    'f1d4c853fb210940'
    

    如果您的 Python 版本早于 3.5:

    import binascii
    binascii.hexlify(struct.pack('d', a))
    

    或者:

    hex(struct.unpack('>Q', struct.pack('d', a))[0])
    

    如果你有一个浮点数组并想使用 NumPy:

    import numpy as np
    np.set_printoptions(formatter={'int':hex})
    np.array([a]).view('u8')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      相关资源
      最近更新 更多