3

ctypesgenを使用して、次のように定義されたフィールドを持つ構造体(mystructと呼びましょう)を生成しました。

[('somelong', ctypes.c_long),
 ('somebyte', ctypes.c_ubyte)
 ('anotherlong', ctypes.c_long),
 ('somestring', foo.c_char_Array_5),
 ]

その構造体のインスタンス(xと呼びましょう)をファイルに書き出そうとしたとき:open(r'rawbytes'、'wb')。write(mymodule.mystruct(1、2、3、 '12345'))、ファイルに書き込まれる内容がバイトアラインされていないことに気付きました。

バイトアラインメントが1バイトになるように、その構造体をファイルに書き出すにはどうすればよいですか?

4

1 に答える 1

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
于 2012-09-30T15:46:30.277 に答える