Python 中的压缩位字段

Packed Bit Fields in Python

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

from ctypes import *

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

print(sizeof(ABC) * 8) # 128

考虑到 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'

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

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