我有一个小服务器在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用这里介绍的方法之一转换。
谢谢大家的帮助!
答案 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"))