如何使用python中的struct库将一个double打包成两个uint32';s
这就是我想做的: 我有一个double,我需要将它打包成二进制数据,然后获取上面的四个字节,并将它们存储到uint32中(这与设备驱动程序有关) 我已经用浮点数做过了:如何使用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
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')])