Python:如何将十六进制字符转换为CType数据类型(例如,uint32_t,uint16_t等)?

问题描述 投票:1回答:1

有没有人知道将一串十六进制字符转换为特定ctype变量的方法?

为了详细说明,我需要创建一个函数,它接受一个十六进制字符列表和一个表示数据类型的字符串,并根据指定的数据类型生成一个值。

我正在解析MAVlink字段,其值取数据类型为:uint64_t,uint32_t,int32_t,uint16_t,int16_t,uint8_t,int8_t,float,char

另外,字段的值可以是上述类型的数组。

这就是我现在的功能:

    def getValue(payload, ftype):
        #  Check if signed or unsigned
        if ftype.find("uint") != -1: signed = False
        #  Check size of data type
        if   ftype.find('int8_t') != -1: stride = 1
        elif ftype.find('int16_t') != -1: stride = 2
        elif ftype.find('int32_t') != -1: stride = 4
        elif ftype.find('float') != -1: stride  = 4
        else: stride = 1 (Assume characters)
        chars = []
        while(stride > 0):
            #  Pop two characters to get one byte
            chars.append(payload.pop(0))
            chars.append(payload.pop(0))
            stride -= 1
        #  Convert selected characters to value of specified data type
        return convertToValueAsString(chars, ftype) #  I don't know how to do this

我看一下ctypes并使用ctypes.uint * _t.value(a)。但是,当数据类型是字符串而不是已知值时,我不确定如何使用此函数。

python hex ctypes type-conversion
1个回答
0
投票

使用struct模块。

import struct
payload = b'\x00\x7d\x00\x00\x01\x00\x00\x00'
format_ = 'Hxxb'
bytelen = struct.calcsize(format_)  # Value is: 5
print(struct.unpack(format_, payload[:bytelen]))  # (32000, 1)
print(struct.pack(format_, 32000, 1))  # b'\x00}\x00\x00\x01'
© www.soinside.com 2019 - 2024. All rights reserved.