使用chr()方法将\ x添加到列表中的字符时出现问题

时间:2013-10-31 23:08:18

标签: python list python-2.7 hex

我正在尝试通过套接字将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的字符串。

3 个答案:

答案 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_)))