Python学习笔记之struct的unpack与pack一个类的使用示例(二)

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值