【问题标题】:"Literally" convert a String into a bytearray“从字面上”将字符串转换为字节数组
【发布时间】:2016-07-27 19:21:57
【问题描述】:

我有一个小型服务器使用 python 中的套接字发送原始数据,它只接受字节数组作为输入。在这个字节数组中,我必须包含 mac 地址。这些 mac 地址来自一个 json 文件,作为字符串导入。 例如“00 11 22 33 44 55”(实际上没有空格)

我正在寻找的是一种将此字符串编码为字节数组的简单方法。所以第一个字节应该是 00,第二个是 11,依此类推。

我发现的所有“解决方案”都会将任何字符串编码为字节数组,但这不是我想要的,因为它会进一步拆分我的 mac 地址,因为它们会编码例如 0,然后是 0,然后是 1,然后是 1,依此类推,所以我的 6 字节 MAC 地址变成了 12 字节编码的字节数组。

有没有我可以使用的内置函数,还是我必须创建自己的函数才能做到这一点?


解决方案: 感谢大家和 Arnial 提供最简单的答案。 问题是,我之前或多或少尝试过所有这些答案,但没有任何效果 但是 我的问题不是这些方法的返回类型(我的套接字总是拒绝发送),它实际上是我试图发送的消息的长度。 套接字拒绝发送短于 12 字节(源/目标 mac 地址)的消息,但我只尝试过使用此处介绍的方法之一转换此示例 mac 地址的短消息。

谢谢大家的帮助!

【问题讨论】:

  • 您可能必须创建自己的函数。您需要成对地遍历字符串,尝试使用谷歌搜索。
  • 哇,Python 提供了大量的函数来执行这个任务的微小变化。到目前为止,bytes.fromhexbinascii.unhexlify(以及它的另一个名称,binascii.a2b_hex)和base64.b16decode 已出现在答案中。我想知道是否还有更多。

标签: python python-3.x


【解决方案1】:

你的转换并不像你想象的那么真实。

字符串“00112233445566”有 12 个字符长,这就是它转换为 12 字节数组的原因。

你的 mac 看起来像十六进制编码的字节字符串,所以你可能可以使用这个:

bytes.fromhex( "001122334455" )

它将创建从零字节开始的字节序列,然后是 0x11 (17),然后是 0x22 (34) ...

【讨论】:

  • 很好,这是最好的方法。无需导入任何包或进行自己的转换。
【解决方案2】:

只需将字符串分成 2 个字符的块,然后解释十六进制值。

def str2bytes(string):
    return tuple(int(string[i:i+2], 16) for i in range(0, len(string), 2))

print str2bytes("001122334455")          #(0, 17, 34, 51, 68, 85)

如果您正在寻找上述的字符串版本,那么:

def str2bytes(string):
    return "".join(chr(int(string[i:i+2], 16)) for i in range(0, len(string), 2))

print str2bytes("001122334455")  #Encoded string '\x00\x11"3DU' same as '\x00\x11\x22\x33\x44\x55'

【讨论】:

    【解决方案3】:

    这实际上是内置的!我是binascii.unhexlify

    import binascii
    
    binascii.unhexlify('001122334455')
    

    【讨论】:

    • 哦,是的!完全忘记了这个
    【解决方案4】:

    https://docs.python.org/3/library/binascii.html#binascii.a2b_hex

    import binascii
    def str2bytes(string):
        return binascii.a2b_hex(string)
    
    print(str2bytes("001122334455"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2021-11-11
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多