函数返回时的Python十六进制转换



我有一块板,它返回一个字节类型,其中包含值:b'x0126.381x00x00x00'

当我在函数中返回时,它会自动将返回格式化为浮点:

def read(address, command, seconds, length):
i2c.writeto(address, command)
time.sleep(seconds)
result = i2c.readfrom(address, length).decode("utf-8")
return result
# Returns 26.381

如果我打印这个结果,它会给我正确的26.381,如果我进行

print(type(read(a, c, s, l)))
# Returns <class: 'str'>

但是,如果我尝试将这个值添加到字典中:

results = dict()
results["test"] = read(a, c, s, l)
print(results)
# Returns {'test': 'x0126.381x00x00x00'}

我在Raspberry Pi Pico上使用microython,但我认为这也是Python3中的一个问题。

我将从一个精心选择的固定字节字符串开始,以产生一致的结果,并展示解码版本如何以不同的方式打印,无论它是用作字符串还是保存在容器中。

def read():   # parameters elided
readfrom = b'x0126.381'
print(readfrom, '         <========== byte array')
result = readfrom.decode("utf-8")
return result
data = read()  # as if reading from an `i2c` device
results = dict()
results["test"] = data
print(data, '                <========== string')
print(results, ' <========== dict')
print(results["test"], '                <========== string again')
print(repr(results["test"]), '            <========== repr of string')

输出:

b'x0126.381'          <========== byte array
26.381                 <========== string
{'test': 'x0126.381'}  <========== dict
26.381                 <========== string again
'x0126.381'             <========== repr of string

如果没有看到设备的文档,很难确定如何处理返回值。然而,在您的问题中,您建议期望的回报值应该是一个浮动。我怀疑前导b'x01'有一些特殊的含义(例如,返回了什么类型的值(。末尾的b'x00'是空字节,也不可打印。

对于这个答案,我将把b'x01'b'x00'识别为不可打印的字符,并忽略它们。

剩下的字符应该是浮点数字的字符串表示。

将";字符串浮动";在将其存储在字典中之前,将其转换为实际的Python浮点值。

例如:

>>> raw_value = b'x0126.381x00x00x00'
>>> print(type(raw_value), raw_value)
<class 'bytes'> b'x0126.381x00x00x00'
>>> str_value = raw_value.decode('utf8')
>>> print(type(str_value), str_value)
<class 'str'> □26.381
>>> printable_value = ''.join(c for c in str_value if c.isprintable())
>>> print(type(printable_value), printable_value)
<class 'str'> 26.381
>>> float_value = float(printable_value)
>>> print(type(float_value), float_value)
<class 'float'> 26.381
>>> results = dict()
>>> results["test"] = float_value
>>> print(results)
{'test': 26.381}

总之,有三个阶段可以转换原始返回的字节:

  1. 将字节解码为字符串"utf8">
  2. 使用isprintable()函数查找可打印字符
  3. 将浮点值的字符串表示形式转换为Python浮点

最新更新