使用ctypesgen,我生成了一个结构(让我们称之为mystruct),其字段定义如下:
[('somelong', ctypes.c_long),
('somebyte', ctypes.c_ubyte)
('anotherlong', ctypes.c_long),
('somestring', foo.c_char_Array_5),
]
当我尝试写出该结构的一个实例(让我们称之为x)为file时: open(r'rawbytes','wb')。write(mymodule.mystruct(1,2,3,'12345')),我注意到写入文件的内容不是字节对齐的。
我应该如何写出该结构文件,使字节对齐为1个字节?
答案 0 :(得分:4)
在定义_pack_=1
之前定义_fields_
。
示例:
from ctypes import *
from io import BytesIO
from binascii import hexlify
def dump(o):
s=BytesIO()
s.write(o)
s.seek(0)
return hexlify(s.read())
class Test(Structure):
_fields_ = [
('long',c_long),
('byte',c_ubyte),
('long2',c_long),
('str',c_char*5)]
class Test2(Structure):
_pack_ = 1
_fields_ = [
('long',c_long),
('byte',c_ubyte),
('long2',c_long),
('str',c_char*5)]
print dump(Test(1,2,3,'12345'))
print dump(Test2(1,2,3,'12345'))
输出:
0100000002000000030000003132333435000000
0100000002030000003132333435
或者,使用struct
模块。请注意,定义字节顺序<
非常重要,它会输出相当于_pack_=1
的内容。没有它,它将使用默认包装。
import struct
print hexlify(struct.pack('<LBL5s',1,2,3,'12345'))
输出:
0100000002030000003132333435