在Python中将0x字符串解释为十六进制

4

我正在将一些十六进制字节追加到一个packet = []中,我想以0x__的形式返回这些十六进制字节作为十六进制数据。

packet.append("2a")
packet.append("19")
packet.append("00")
packet.append("00")

packHex = []

for i in packet:
    packHex.append("0x"+i) #this is wrong

return packHex

我该怎样将('2a', '19', '00', '00')packet中转换为(0x2a, 0x19, 0x0, 0x0)packHex中?我需要真正的十六进制数据,而不是看起来像十六进制数据的字符串。我正在组装一个要通过pcap发送的数据包,pcap_sendpacket(fp,packet,len(data))其中packet应该是一个十六进制列表或元组,也许可以使用十进制,但我更喜欢十六进制。感谢您的回答。packetPcap[:len(data)] = packHex 解决方案: for i in packet: packHex.append(int(i,16)) 如果需要以十六进制输出,可以使用以下命令: print ",".join(map(hex, packHex))

抱歉,我试图保持“真实”... - hip 1分钟前 - soulseekah
2个回答

5

您真正需要的是整数,而不是“十六进制数据”。只有在您拥有以字符串形式表示的数字时,十六进制符号才有意义。

要解决您的问题,请使用列表推导式:

[int(x, 16) for x in packet]

或者将结果作为元组获取:
tuple(int(x, 16) for x in packet)

不对,那不是十六进制值,那是十进制值。 - soulseekah
2
这只是表示法而已。整数是数字。十六进制、十进制和八进制是表示数字的方式。0x3452同一个数字。如果你想要打印十六进制的数字,那么就完全不同了,这就是使用 'x' 字符串格式的地方。 - Thomas Wouters
感谢您的回答和评论。问题现在已经解决了。很抱歉没有接受您的答案@Mark,我喜欢@MAK提供的额外的map,不过您的回答最先到位。谢谢。 - soulseekah
1
还有一个内置函数 hex(),用于将数字转换为十六进制字符串表示形式,包括前导的 0x - Mike DeSimone

4

为什么不直接构建一个int列表,然后以16进制的形式打印出来(可以使用"%x"%valuehex)?如果这些值是以这种形式(例如从其他来源)提供给您的,则可以使用带有可选第二个参数的int将其转换为一个int

>>> int('0x'+'2a',16)
42
>>> packet=["2a","19","00","00"]
>>> packet=[int(p,16) for p in packet]
>>> packet
[42, 25, 0, 0]
>>> print ", ".join(map(hex,packet))
0x2a, 0x19, 0x0, 0x0

我正在组装一个数据包,将其发送到 pcap,使用 pcap_sendpacket(fp,packet,len(data))。其中 packet 应该是一个十六进制列表或元组,也许可以用十进制表示,但我还没有尝试过,我更喜欢使用十六进制。谢谢你的回答。 - soulseekah
3
所有的数值在底层都是二进制的。 当你将其转换为字符串并打印时,十六进制或十进制只是表示方式。 因此,“十六进制数”和“十进制数”这样的区分对于存储在变量中的值是没有意义的。 - MAK
我需要 packetPcap[:len(data)] = packHex,其中 packHex 包含类似 (0x00, 0x1F, 0x3C, 0x84, 0x70, 0x22, 0x1C, 0xAF, 0xF7) 的内容。感谢您的帮助。+1 - soulseekah
1
map(hex,packet)很有趣。所以基本上,无论列表/元组包含十六进制还是十进制,最终都只是位。我可以提供(0x00, 39, 29, 0x32),然后将其解析为十进制。然后我可以使用map(hex,来以十六进制显示,以便更好地阅读。谢谢您的回答。 - soulseekah
1
@Soulseekah:是的。除了一点,所有东西都被解析成二进制而不是十进制。Python在字面值中期望的默认基数是十进制,但即使如此,一旦读取后也会转换为二进制。 - MAK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接