ctypes中structure union的内存对其方式

在C语言中,我们如果要自定义对其规则,可以通过使用

#pragma pack(n)
/*表示n字节对其,最好是2的指数集*/

在python中,默认对齐方式和c编译器相同。我们可以通过重载 _pack_属性,来声明自己的对其方式。

n必然是一个整数,并且为这个字段设置对其方式。(不同的对其方式可能不同)

ctypes使用当前机器的字节序。可以通过明确声明来指明字节序。

BigEndianStructure,LittleEndianStructrue,BigEndianUnion和LittleEndianUnion基类。这些字段都不可以包含指针字段。

比特位

在结构体和共用体中,只有c_int类型可以声明 bit 字段参数,位宽由c_int的第三参数 _fields_ 元组指定。比如。

>>> class Int(Structure):
...     _fields_ = [("first_16", c_int, 16),
...                 ("second_16", c_int, 16)]
...
>>> print(Int.first_16)
<Field type=c_long, ofs=0:0, bits=16>
>>> print(Int.second_16)
<Field type=c_long, ofs=0:16, bits=16>
>>>

特别注意,ctypes不支持传递带有bit位成员的结构体或者共用体作为参数传递。因为这个运行结果和操作系统有关,32位的可能工作正常,但是64就不一定了,所以,有这种的必然需要通过指针的方式。

猜你喜欢

转载自blog.csdn.net/rubikchen/article/details/89445060