gpt4 book ai didi

python - 将 float 组转换为小/大端

转载 作者:行者123 更新时间:2023-11-30 23:36:30 25 4
gpt4 key购买 nike

我正在生成用于模拟网络的单元测试的二进制文件。通过网络发送的一些数据采用 Little Endian 或 Big Endian 模式,我想使用 stub 模拟这些数据并创建二进制文件。

因此,换句话说,我不会使用事件网络进行单元测试,而是生成包含我期望从网络套接字获得的等效数据的二进制文件。

我正在使用 Python 2.7 生成字节数组并将它们保存到文件中,但我在将 float 组转换为小端模式时遇到问题。

from array import array
output_file = open(r"C:\temp\bin.dat", "wb")
float_array = array('d', [1, 1.2, 0.34, 9.8, 0.13, 1.1, 0.88, 72])
float_array.byteswap(); #This doesn't convert it to little endian!
float_array.tofile(output_file)
output_file.close()

所以我想知道是否有人知道如何操作数组,这样当我执行float_array.tofile()时,它将以小/大端模式写入二进制数据。

此代码给出以下输出:

Val = 8.6184E-41
Val = 0.0
Val = 4.1897916E-8
Val = 4.172325E-8
Val = -1.9212016E-29
Val = -490.3153
Val = -1.5834067E-23

与所需的array('d', [1, 1.2, 0.34, 9.8, 0.13, 1.1, 0.88, 72])

当我注释掉 byteswap 方法时,我得到以下内容

Val = 0.0
Val = 1.875
Val = 4.172325E-8
Val = 1.9
Val = 1.9023206E17
Val = 1.67
Val = -1.5881868E-23

但是,在真实联网模式下,效果很好。但这对单元测试没有帮助!

最佳答案

您向我们展示的代码正在创建一个 8 个(64 位) double 的数组。您没有向我们展示的代码正在读回 4 个(32 位) float 的数组。除了这个问题之外,它们都是正确的。

解决方案是在此处使用 'f' 或在此处使用 'd',以便您的读写匹配。

验证:

>>> float_array = array('d', [1, 1.2, 0.34, 9.8, 0.13, 1.1, 0.88, 72])
>>> float_array.byteswap()
>>> s = float_array.tostring()
>>> new_float_array = array('f')
>>> new_float_array.fromstring(s)
>>> new_float_array
array('f', [8.618405945136922e-41, 0.0, 4.189791624753525e-08, 4.17232506322307e-08, -1.9212016359104883e-29, -490.3153076171875, -1.5834066576694083e-23, -6.352746725754018e-23, -360092172025856.0, -5.209340637631123e-17, -1.5917267736367743e-23, -6.352746725754018e-23, -2.141351348326541e+32, 4.89745031096063e-14, 2.950574046482335e-41, 0.0])

看起来很眼熟吗?现在取出byteswap:

>>> float_array = array('d', [1, 1.2, 0.34, 9.8, 0.13, 1.1, 0.88, 72])
>>> s = float_array.tostring()
>>> new_float_array = array('f')
>>> new_float_array.fromstring(s)
>>> new_float_array
array('f', [0.0, 1.875, 4.17232506322307e-08, 1.899999976158142, 1.902320558192722e+17, 1.6699999570846558, -1.5881868392106856e-23, 2.5562498569488525, 9.121204334167384e-33, 1.5049999952316284, -1.5881868392106856e-23, 1.8874999284744263, -71.68000030517578, 1.84499990940094, 0.0, 3.28125])

请注意,为了方便起见,我使用 tostring/fromstring,而不是 tofile/fromfile,后者意味着我没有指定计数。但如果您指定计数为 8,则显然您会将前 4 个 double 读取为 8 个 float 。如果您随后将它们格式化为看起来像您的输出:

>>> print '\n'.join('Val = {}'.format(val) for val in new_float_array[8])
Val = 8.6184E-41
Val = 0.0
Val = 4.1897916E-8
Val = 4.172325E-8
Val = -1.9212016E-29
Val = -490.3153
Val = -1.5834067E-23

关于python - 将 float 组转换为小/大端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16450786/

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