我想将一个10位整数和一个54位整数打包成64位结构。但是这段代码最终使用128位。
from ctypes import *
class ABC(Structure):
_fields_ = [("a", c_int, 10), ("b", c_uint64, 54)]
print(sizeof(ABC) * 8) # 128
答案 0 :(得分:1)
无论出于何种原因,当您将不同宽度的对象混合到同一个字节中时,ctypes
不能正确进行位打包。这样的事情似乎对我有用:
class ABC(Structure):
_pack_ = 1
_fields_ = [("a",c_int64,10),("b",c_uint64,54)]
答案 1 :(得分:0)
考虑int_10
和int_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'