1

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

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

我正在使用 Python 2.7 生成字节数组并将它们保存到文件中,但是我无法将我的浮点数组转换为小端模式。

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

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

4

1 回答 1

3

您向我们展示的代码正在创建一个包含 8 个(64 位)双精度数的数组。您没有向我们展示的代码正在读回一个包含 4 个(32 位)浮点数的数组。除了那个问题,他们都是正确的。

解决方案是在'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 个双精度数读取为 8 个浮点数。如果您随后将它们格式化为您的输出:

>>> 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
于 2013-05-08T22:01:10.583 回答