Python ctypesgen / ctypes:如何在单字节对齐中将struct字段写入文件

时间:2012-09-30 06:07:51

标签: struct ctypes

使用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个字节?

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