Python中的压缩位字段

Python中的压缩位字段,python,memory,structure,bit-fields,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 考虑到int_10和int_54是具有所需位的整数: >>> def pack(int_10, int_54): ... ret

我想把一个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_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'

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

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

你只考虑无符号整数吗?没有,有符号和无符号。但如果您有一个只针对未签名的解决方案,我想看看它。这对于压缩存储等数据是合适的。但它不允许我轻松地操作位字段,比如:
x=ABC(10,20);x、 a=-15;x、 b=50
我真的在寻找Python的内置功能,如果它存在的话。
\u pack\u
属性到底做什么?它的有效值是什么本质上,它模拟了C的
pragma pack
,但由于您的结构已经按照标准宽度进行了字节对齐,因此它可能不会对此处的有效值产生任何影响,而搜索时的其他注释表明它需要2的小正幂,我认为这适用于Python。指定要用于打包的值(以字节为单位)。。。有效值为1、2、4、8和16。构件的对齐将位于n的倍数或构件尺寸的倍数(以较小者为准)的边界上。
class ABC(Structure):
   _pack_ = 1
   _fields_ = [("a",c_int64,10),("b",c_uint64,54)]