【问题标题】:Convert byte string in Micropython在 Micropython 中转换字节字符串
【发布时间】:2019-07-28 09:44:10
【问题描述】:

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

我已经尝试过:

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

这会导致错误,例如:

TypeError: 无法将字节转换为 int

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

AttributeError: 'bytes' 对象没有属性 'hex'

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

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

【问题讨论】:

    标签: micropython


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

        你试过import struct吗?

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

        【讨论】:

        • 对我来说是struct.unpack('i', data)
        【解决方案4】:

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

        this question 的答案描述了如何在标准 Python 中执行此操作,但是通过快速检查 online MicroPython console 您不能只在字节对象本身上调用 .hex(),而且我们没有binascii 或 codecs 模块,所以这些方法都不起作用。

        不过,用普通的 Python 做你想做的事并不难:

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

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

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

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

        【讨论】:

        【解决方案5】:

        不清楚你到底想做什么。

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

        data = s.recv(64)
        

        这会将其转换为字符串:

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

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

        【讨论】:

        • @ larsks 谢谢,我想要实现的是以下两件事之一或两者:1. 使数据可用(if 语句等),2.调用 'hex() 是为了' cast' 十六进制格式的传入数据,以便在打印时可以显示。显然我缺乏有关数据类型的知识。
        猜你喜欢
        • 2021-06-28
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 1970-01-01
        相关资源
        最近更新 更多