在Micropython中转换字节字符串

时间:2019-03-06 16:34:13

标签: micropython

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

我尝试过类似的事情:

max-height:1000px

会导致以下错误:

  

TypeError:无法将字节转换为int

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

  

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

我一般对Python和Micro-python还是陌生的。据我所知,这还没有直接为Micropython回答。

如果这是专门针对Python3的答案,我认为值得对Micropython再次重申,因为实现可能略有不同,并且也许可以找到可接受的“最佳实践”。

4 个答案:

答案 0 :(得分:1)

不清楚您要做什么。

将字节转换为字符串的方法是调用.decode方法。这为您提供了字节数:

data = s.recv(64)

然后将其转换为字符串:

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

但是您尝试调用hex(),该方法采用一个整数并返回相应的十六进制值。就您的问题而言,这没有多大意义。

答案 1 :(得分:0)

因此,您拥有的是一个字节对象,听起来像您想要的是一个包含这些字节的十六进制表示形式的字符串。

this question的答案描述了如何在标准Python中执行此操作,但是通过对online MicroPython console的快速检查,您不能只对字节对象本身调用myStore.add({text: 'foo'}) ,并且我们没有myStore.add({field1: 'foo'}) .hex()模块,因此这些方法都不起作用。

不过,使用普通的Python来做想要的事情并不困难:

binascii

这里,我们使用列表推导从字节对象codecs依次获取每个字节>>> data = b'hello!' >>> ''.join(['{:02x}'.format(b) for b in data]) '68656c6c6f' 。然后,我们使用b将其格式化为十六进制格式的两个字符的字符串,并在必要时使用前导零。方括号内的表达式为我们提供了这两个字符的字符串的列表,因此最终我们data将它们'{:02x}'.format(b)一起用一个空字符串隔开。

例如,如果要在每个两位数字组之间留一个空格,请将join替换为''

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

答案 2 :(得分:0)

虽然我认为@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

答案 3 :(得分:0)

我需要将字节 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