我怎样才能使用 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')])
所以这就是我想做的: 我有一个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')])