我怎样才能使用 python 中的结构库将一个 double 打包成两个 uint32

How can I use the struct library in python to pack a double into two uint32's

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

我已经用花车做到了:

import struct
import numpy as np
tmp = struct.pack('<f',float(datatobeconverted))
dataout = np.uint32(struct.unpack('<I',tmp))

我想对双打进行此操作,但它似乎不起作用:

tmp = struct.pack('<d',double(datatobeconverted))
dataout0 = np.uint32(struct.unpack('<I',tmp[0:3]))
dataout1 = np.uint32(struct.unpack('<I',tmp[4:7]))

有什么想法吗?顺便说一句,我认为 struct 存储二进制数据的方式不直观且难以阅读

你只是切片 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
>>> 

错误信息非常清楚:您传递的字符串 arg 是 不是 "of length 4".

Python 个切片总是 "right-bound excluded"。因此,要切掉前 4 个字节,您可以:

>>> dataout0 = np.uint32(struct.unpack('<I',tmp[:4]))

0:4 中的 0: 是可选的,最好避免它,作为样式问题,以尽量减少混乱(Tufte 的 "no wasted pixels" 原则)。

类似地,要获取所有内容 前四个字节,

>>> dataout1 = np.uint32(struct.unpack('<I',tmp[4:]))

左边界包括,因此您可以对两个切片使用相同的值(此处为4)(右边界的优点之一-排除概念,帮助您避免差一错误)。

几十年前,我第一次遇到这个原则是在 Koenig 的那本仍然很棒的书中 "C traps and pitfalls",从那以后我就一直遵守这个原则 -- 一贯采用这个原则是我最初喜欢 Python 的一部分视线:-).

(我相信 pandas 帧上的某种切片是整个广泛 Python 库中这一原则的一个例外——这也是我不能全心全意地投入 pandas...但是,那是另外一回事了!-).

unpack 创建一个元组,您需要对其进行解包或索引以获取各个值,即使您只是解包单个值也是如此。您可以使用一次调用 unpack 来同时获取两个值。

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

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')])