有没有人知道将十六进制字符串转换为特定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)。但是,当数据类型是字符串而不是已知值时,我不确定如何使用此函数。
答案 0 :(得分: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'