Python中的打包位字段

时间:2015-10-04 17:12:49

标签: python memory structure bit-fields

我想将一个10位整数和一个54位整数打包成64位结构。但是这段代码最终使用128位。

from ctypes import *

class ABC(Structure):
    _fields_ = [("a", c_int, 10), ("b", c_uint64, 54)]

print(sizeof(ABC) * 8) # 128

2 个答案:

答案 0 :(得分:1)

无论出于何种原因,当您将不同宽度的对象混合到同一个字节中时,ctypes不能正确进行位打包。这样的事情似乎对我有用:

class ABC(Structure):
   _pack_ = 1
   _fields_ = [("a",c_int64,10),("b",c_uint64,54)]

答案 1 :(得分:0)

考虑int_10int_54是具有所需位数的整数:

>>> def pack(int_10, int_54):
...     return (int_10 & 0x3FF) | (int_54 & 0x3FFFFFFFFFFFFF) << 10

>>> bin(pack(1, 1))
'0b10000000001'
>>> bin(pack(1, 2 ** 54 - 1))
'0b1111111111111111111111111111111111111111111111111111110000000001'
>>> bin(pack(2 ** 10, 2 ** 54))
'0b0'

然后,您可以使用struct.pack打包生成的整数以获取字节字符串。

>>> import struct
>>> struct.pack('Q', pack(2 ** 10 - 1, 2 ** 54 - 1))
'\xff\xff\xff\xff\xff\xff\xff\xff'