3

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

我尝试过以下方法:

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

这会导致错误,例如:

TypeError:无法将字节转换为 int

并且: data = s.recv(64).hex() 导致:

AttributeError:“字节”对象没有属性“十六进制”

一般来说,我对 Python 和 Micro-python 相当陌生。据我所知,Micropython 并没有直接回答这个问题。

如果这是专门针对 Python3 回答的,我认为值得为 Micropython 重新迭代它,因为实现可能会略有不同,并且可能会找到可接受的“最佳实践”。

4

5 回答 5

4

目前尚不清楚您要做什么。

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

data = s.recv(64)

这会将其转换为字符串:

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

但是您正在尝试调用hex(),它接受一个整数并返回相应的十六进制值。在您的问题的背景下,这没有多大意义。

于 2019-03-06T18:18:41.263 回答
2

你试过import struct吗?

new = struct.unpack('=i', data)
于 2019-03-11T10:53:01.843 回答
1

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

这个问题的答案描述了如何在标准 Python 中执行此操作,但是通过在线 MicroPython 控制台的快速检查,您不能只调用.hex()字节对象本身,而且我们没有binasciiorcodecs模块,所以这些都没有方法会起作用。

然而,用普通的 Python 做你想做的事情并不难:

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

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

例如,如果您想在每个两位数组之间留一个空格,请将 替换''' '

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

于 2019-03-08T09:15:35.343 回答
1

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

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

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

x = int.from_bytes(byte_string, byte_order)

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

于 2020-06-10T16:01:01.170 回答
1

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

从系统检索到的 MAC 地址如下所示: b'\xacg\xb27-\xcc'. 这对读者不太友好。把它变成一串十六进制数字......

import binascii

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

产量...

ac67b2372dcc
于 2021-03-24T23:41:45.683 回答