Using ctypesgen, I generated a struct (let's call it mystruct) with fields defined like so:
[('somelong', ctypes.c_long),
('somebyte', ctypes.c_ubyte)
('anotherlong', ctypes.c_long),
('somestring', foo.c_char_Array_5),
]
When I tried to write out an instance of that struct (let's call it x) to file:
open(r'rawbytes', 'wb').write(mymodule.mystruct(1, 2, 3, '12345')), I notice that the contents written to the file are not byte-aligned.
How should I write out that struct to file such that the byte-alignment is 1 byte?
解决方案
Define _pack_=1 before defining _fields_.
Example:
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'))
Output:
0100000002000000030000003132333435000000
0100000002030000003132333435
Alternatively, use the struct module. Note it is important to define the endianness < which outputs the equivalent of _pack_=1. Without it, it will use default packing.
import struct
print hexlify(struct.pack('
Output:
0100000002030000003132333435