在 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()
,而且我们没有 binascii
或 codecs
模块,所以这些方法中的 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
如前所述,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()
,而且我们没有 binascii
或 codecs
模块,所以这些方法中的 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