如何使用python中的struct库将一个double打包成两个uint32';s

如何使用python中的struct库将一个double打包成两个uint32';s,python,numpy,struct,pack,unpack,Python,Numpy,Struct,Pack,Unpack,这就是我想做的: 我有一个double,我需要将它打包成二进制数据,然后获取上面的四个字节,并将它们存储到uint32中(这与设备驱动程序有关) 我已经用浮点数做过了: import struct import numpy as np tmp = struct.pack('<f',float(datatobeconverted)) dataout = np.uint32(struct.unpack('<I',tmp)) 导入结构 将numpy作为np导入 tmp=struct.pa

这就是我想做的: 我有一个double,我需要将它打包成二进制数据,然后获取上面的四个字节,并将它们存储到uint32中(这与设备驱动程序有关)

我已经用浮点数做过了:

import struct
import numpy as np
tmp = struct.pack('<f',float(datatobeconverted))
dataout = np.uint32(struct.unpack('<I',tmp))
导入结构
将numpy作为np导入

tmp=struct.pack(“您只是在切片
tmp
错误

>>> dataout0 = np.uint32(struct.unpack('<I',tmp[0:3]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: unpack requires a string argument of length 4
>>> 
左边界包括在内,因此您可以对两个滑动使用相同的值(此处为
4
)(右边界排除概念的优点之一,帮助您避免一个错误)

几十年前,我在Koenig仍然很棒的书《C陷阱和陷阱》中第一次遇到了这个原则,从那时起,我就一直遵循着这个原则——这个原则的一贯采用是我第一眼看到Python时所热爱的一部分:-)


(我相信在
pandas
框架上的某种切片是这一原则在广泛使用的Python库中的一个例外——这也是为什么我不能全身心投入
pandas
…但是,那是另一个故事!-)。

解包
创建了一个元组,您需要解包或索引来获取单个值,即使您只是解包单个值。您可以使用对
解包的单个调用来同时获取这两个值

tmp = struct.pack('<d',double(datatobeconverted))
data0, data1 = struct.unpack('<II',tmp)
dataout0, dataout1 = np.uint32(data0), np.uint32(data1)

tmp=struct.pack('
np.dtype
可以执行相同类型的重新打包

np.array(struct.unpack('II', struct.pack('d', double(np.pi))), dtype='uint')
# array([1413754136, 1074340347], dtype=uint32)

dt1 = np.dtype((double, {'a':(np.uint32,0),'b':(np.uint32,4)}))
np.array([np.pi], dtype=dt1)[['a','b']]
# array([(1413754136L, 1074340347L)], dtype=[('a', '<u4'), ('b', '<u4')])
np.array(struct.unpack('II',struct.pack('d',double(np.pi))),dtype='uint')
#数组([1413754136,1074340347],dtype=uint32)
dt1=np.dtype((double,{'a':(np.uint32,0),'b':(np.uint32,4)}))
数组([np.pi],dtype=dt1)[[a','b']

#数组([(1413754136L,1074340347L)],dtype=[('a',”而不是说“它不工作”,向我们显示错误消息。如果您对计算机体系结构有更好的了解,您可能不会认为
struct
存储数据的方式很愚蠢。
>>> dataout1 = np.uint32(struct.unpack('<I',tmp[4:]))
tmp = struct.pack('<d',double(datatobeconverted))
data0, data1 = struct.unpack('<II',tmp)
dataout0, dataout1 = np.uint32(data0), np.uint32(data1)
np.array(struct.unpack('II', struct.pack('d', double(np.pi))), dtype='uint')
# array([1413754136, 1074340347], dtype=uint32)

dt1 = np.dtype((double, {'a':(np.uint32,0),'b':(np.uint32,4)}))
np.array([np.pi], dtype=dt1)[['a','b']]
# array([(1413754136L, 1074340347L)], dtype=[('a', '<u4'), ('b', '<u4')])