在 Micropython 中转换字节字符串

Convert byte string in Micropython

如前所述,here 通过 Micropython 套接字接收消息会导致留下要处理的字节字符串。 我的问题是如何将这个字节串转换成另一种可用的格式?

我尝试过类似的方法:

data = s.recv(64)
new = hex(data)

这会导致错误,例如:

TypeError: can't convert bytes to int

并且: 数据 = s.recv(64).hex() 结果:

AttributeError: 'bytes' object has no attribute 'hex'

总的来说,我对 Python 和 Micro-python 还比较陌生。据我所知,Micropython 还没有直接回答这个问题。

如果已经针对 Python3 专门回答了这个问题,我认为值得为 Micropython 重复它,因为实现可能略有不同,也许可以找到可接受的 'best practice'.

不清楚您要做什么。

将字节转换为字符串的方法是调用 .decode 方法。这给你字节:

data = s.recv(64)

然后将其转换为字符串:

data = data.decode('utf-8')

但您正在尝试调用 hex(),它采用单个整数和 returns 相应的十六进制值。这在你的问题的上下文中没有多大意义。

所以你拥有的是一个字节对象,听起来你想要的是一个包含这些字节的 十六进制表示的字符串。

this question describe how to do this in standard Python, but from a quick check with the online MicroPython console 的答案你不能只对字节对象本身调用 .hex(),而且我们没有 binasciicodecs 模块,所以这些方法中的 none 会起作用。

然而,用普通的方式做你想做的并不难Python:

>>> data = b'hello!'
>>> ''.join(['{:02x}'.format(b) for b in data])
'68656c6c6f'

这里我们使用列表理解从字节对象 data 依次获取每个字节 b。然后,我们使用 '{:02x}'.format(b) 将其格式化为十六进制格式的两个字符的字符串,必要时使用前导零。方括号内的表达式为我们提供了一个包含两个字符的字符串的列表,所以最后我们 join 将它们一起用空字符串分隔。

如果您希望在每个两位数组之间使用 space,例如,将 '' 替换为 ' '

我发现 this 是 Python 中字符串格式化方法的有用起点。 MicroPython 支持 %-operator 和 str.format 方法,但不支持格式化字符串文字。

你试过了吗import struct

new = struct.unpack('=i', data)

虽然我认为@larsks 的答案是最好的(调用'.deocde()'),但您最初说您想要十六进制的。

值得注意的是,ubinascii 模块在大多数 micropython 端口上都可用,并且具有用于转换为十六进制的 'hexlify' 函数。它仍然 return 一个字节字符串,所以你可能仍然需要根据你的预期目的调用 .decode() :https://docs.micropython.org/en/latest/library/ubinascii.html

您可能还想查看 'int' 类型中内置的 'from_bytes' class 方法。您可以将其用于:

x = int.from_bytes(byte_string, byte_order)

https://docs.micropython.org/en/latest/library/builtins.html?highlight=to_bytes

我需要将字节 MAC 地址转换为表示十六进制值的字符串。 @birdistheword99 给我指路...

从系统检索到的 MAC 地址类似于:b'\xacg\xb27-\xcc'。这不是很 reader 友好。使其成为一串十六进制数字...

import binascii

mac_bytes = b'\xacg\xb27-\xcc'
mac_str = binascii.hexlify(mac_bytes).decode()
print(mac_str)

收益率...

ac67b2372dcc