Python学习笔记之struct的unpack与pack一个类的使用示例(一)
4.数据组域结构
@dataclass
class s_with_int_array(basedataclass):
'''
typedef struct s_with_int_array {
uint8 * uint8_array;
uint16 * uint16_array;
uint32 * uint32_array;
};
'''
array8: uint8_array = dataclasses.field(default_factory=uint8_array, metadata={LENGTH_FIELD: 2})
array16: uint16_array = dataclasses.field(default_factory=uint16_array, metadata={LENGTH_FIELD: 2 * 2})
array32: uint32_array = dataclasses.field(default_factory=uint32_array, metadata={LENGTH_FIELD: 1 * 4})
上述数据结构,直接输入数据就比较简单了,直接输入list即可;
def test_int_array():
d = s_with_int_array(array8=[0x01, 0x02],
array16=[0x0002, 0x0004],
array32=[0x10203040])
print('{}, len={}'.format(d, len(d)))
data = d.pack()
print(hexlify(data))
d2 = s_with_int_array().unpack(data)
print('{}, len={}'.format(d2, len(d2)))
if d2 == d:
print('test_int_array pass\r\n')
else:
print('test_int_array fail\r\n')
数据结果:
s_with_int_array(array8=array[2]:
01 02
, array16=array[2]:
0002 0004
, array32=array[1]:
10203040
), len=10
b'01020200040040302010'
s_with_int_array(array8=array[2]:
01 02
, array16=array[2]:
0002 0004
, array32=array[1]:
10203040
), len=10
test_int_array pass
5.bit域定义
@dataclass
class s_with_bitfield(basedataclass):
'''
union s_with_bitfield{
uint8 * data;
struct bitfield{
uint16:12 handle;
uint16:2 pd_flag;
uint16:2 bc_flag;
uint8 tail;
};
}
'''
data: bytearray = dataclasses.field(default_factory=bytearray, metadata={LENGTH_FIELD: 4, UNION_FIELD: True})
head: uint8 = None
handle: uint12 = None
pb_flag: uint2 = None
bc_flag: uint2 = None
tail: uint8 = None
handle、pd_flag、bc_flag、tail共用data域;
def test_bitfield():
d = s_with_bitfield(head=0, pb_flag=1, bc_flag=2, handle=0x20, tail=255)
print('{}, len={}'.format(d, len(d)))
data = d.pack()
print(hexlify(data))
d2 = s_with_bitfield().unpack(data)
print('{}, len={}'.format(d2, len(d2)))
if d2 == d:
print('test_bitfield pass\r\n')
else:
print('test_bitfield fail\r\n')
if __name__ == '__main__':
test_bitfield()
输出测试结果:
s_with_bitfield(data=bytearray(b'\x00 \x90\xff'), head=0x00(0), handle=32, pb_flag=1, bc_flag=2, tail=0xff(255)), len=4
b'002090ff'
s_with_bitfield(data=bytearray(b'\x00 \x90\xff'), head=0x00(0), handle=32, pb_flag=1, bc_flag=2, tail=0xff(255)), len=4
test_bitfield pass