"从字面上"将String转换为bytearray

时间:2016-07-27 19:21:58

标签: python python-3.x

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

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

所有"解决方案"我发现将任何字符串编码为字节数组,但这不是我想要的,因为它将进一步分割我的mac地址,因为它们将编码例如0,然后是0,然后是1,然后是1等等,所以我的6字节mac-address变成了12字节编码的字节数组。

我可以使用任何内置函数,还是必须创建自己的函数来执行此操作?

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

谢谢大家的帮助!

4 个答案:

答案 0 :(得分:2)

你的转换并不像你想象的那么直接。

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

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

bytes.fromhex( "001122334455" )

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

答案 1 :(得分:1)

将字符串拆分为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'

答案 2 :(得分:0)

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

Insert into Schema.tableName (table_id) values (NEXT VALUE FOR Schema.SequenceName)

答案 3 :(得分:0)

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

import binascii
def str2bytes(string):
    return binascii.a2b_hex(string)

print(str2bytes("001122334455"))