我正在尝试通过套接字将Hex数据发送到远程硬件。我使用的方法适用于某些数据但不适用于其他数据,这是一个例子:
packet_list = ["00","00","00","00","00","05","FF","70","00","00","00"]
packet_list = [(int(x,16)) for x in packet_list]
packet_list = [(chr(x)) for x in packet_list]
输出:
['\x00', '\x00', '\x00', '\x00', '\x00', '\x07', '\xff', 'r', '\x00', '\x00', '\x06', '\x00', '\x00']
这很接近我想要的,但我不想要'r'字符,而应该是70的“hexified”版本,它将是\ x70。我意识到chr()只是给我int 114的ASCII表示,但我真正想要的是在我的十六进制数字前面只有一个带有\ x的字符串。
答案 0 :(得分:2)
首先,您的第一行代码为您提供一个字符串元素:
>>> ["00"+"00"+"00"+"00"+"00"+"05"+"FF"+"70"+"00"+"00"+"00"]
['000000000005FF70000000']
将包含十六进制字符的字符串转换为字节的最简单方法是使用binascii.unhexlify
:
>>> from binascii import unhexlify
>>> unhexlify('000000000005FF70000000')
'\x00\x00\x00\x00\x00\x05\xffp\x00\x00\x00'
或使用列表:
>>> unhexlify(''.join(["00","00","00","00","00","05","FF","70","00","00","00"]))
'\x00\x00\x00\x00\x00\x05\xffp\x00\x00\x00'
这是一个字节集,而不是列表,但将其转换为列表就像调用list()
一样简单,如果你坚持:
>>> list(unhexlify('000000000005FF70000000'))
['\x00', '\x00', '\x00', '\x00', '\x00', '\x05', '\xff', 'p', '\x00', '\x00', '\x00']
请注意,p
只有Python将该字节表示为ASCII可打印字符;它仍然只是相同的字节:
>>> hex(ord('p'))
'0x70'
>>> chr(0x70)
'p'
>>> '\x70'
'p'
这没什么可担心的,它只是一个字节表示。
答案 1 :(得分:-1)
首先用逗号替换所有+。您只是创建一个包含一个大字符串元素的列表。
packet_list = ["00","00","00","00","00","05","FF","70","00","00","00"]
packet_list = [hex(int(x, 16)) for x in packet_list]
print packet_list
输出:
['0x0','0x0','0x0','0x0','0x0','0x5','0xff','0x70','0x0','0x0','0x0']
答案 2 :(得分:-1)
我会咬人 - 为什么不把字符串保留为字符串而不是转换为整数然后回来?
EG: packet_list = [“00”,“00”,“00”,“00”,“00”,“05”,“FF”,“70”,“00”,“00”,“00”] print(list_list中为byte_的list('\ x {}'。format(byte_)))