0

我正在尝试通过套接字将十六进制数据发送到远程硬件。我使用的方法适用于某些数据,但不适用于其他数据,这是一个示例:

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 的字符串。

4

3 回答 3

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'

这没什么好担心的,它只是一个字节表示。

于 2013-10-31T23:15:07.503 回答
-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']

于 2013-10-31T23:12:54.390 回答
-1

我会咬 - 为什么不将字符串保留为字符串而不是转换为整数并返回?

例如:packet_list = ["00","00","00","00","00","05","FF","70","00","00","00"] 打印(list('\x{}'.format(byte_) for byte_ in packet_list))

于 2013-10-31T23:56:02.763 回答