Python - 将十六进制转换为整数/字符

15

我尝试将一个十六进制数转换为int/char(最好是char),但遇到了一些困难。通过这个网站:http://home2.paulschou.net/tools/xlate/,我输入了十六进制的C0A80026,它在DEC / CHAR框中正确输出了我预期包含的IP地址。

这些数据来自外部数据库,我不知道它们是如何保存的,所以我只能使用十六进制字符串本身来工作。

我尝试使用binascii.unhexlify函数进行解码,但我担心我对十六进制的理解可能不够深刻。

使用int()转换仍然无法产生所需的结果。我需要一种将该十六进制字符串(或类似的字符串)转换为原始IP的方法。

更新:对于未来遇到此问题的人们,我稍微修改了下面的答案,提供了一个精确的IP打印输出方式:

dec_output = str(int(hex_input[0:2], 16)) + "." +  str(int(hex_input[2:4], 16)) + "." + str(int(hex_input[4:6], 16)) + "." + str(int(hex_input[6:8], 16))

那个解决方案对我的问题不起作用。 - Draineh
请详细解释重复问题不是重复的。细节很重要。“与我的问题不起作用”太模糊,无法说明任何问题。 - S.Lott
抱歉,我以为你已经比较过它们了。我的问题与将十六进制解码为IP地址有关,而另一个问题并没有涉及到这一点。此外,虽然我对十六进制或Python不是很了解,但没有相关的问题表明我们的相似之处仅在于尝试解码十六进制,但都试图达到两个不同的目标。 - Draineh
它有助于避免所有的假设。我仍然不明白为什么提供的问题不是你的问题的答案,因为(1)我不理解你问题的细微差别,(2)我也不明白你知识上的空白。与其做出假设,还不如更新你的问题以详细说明,为什么一个被广泛接受的已有答案在这种情况下不合适。细节很重要。对问题进行更新比留下评论更好。 - S.Lott
6个回答

12

如果您想从这里获取4个不同的数字,请将其视为4个不同的数字。 您不需要使用binascii

hex_input  = 'C0A80026'
dec_output = [
    int(hex_input[0:2], 16), int(hex_input[2:4], 16),
    int(hex_input[4:6], 16), int(hex_input[6:8], 16),
]
print dec_output # [192, 168, 0, 38]

这个可以概括一下,但是我会留给你一个练习。


9
一种简单的方法。
>>> s = 'C0A80026'
>>> map(ord, s.decode('hex'))
[192, 168, 0, 38]
>>> 

如果您更喜欢列表推导式。
>>> [ord(c) for c in s.decode('hex')]
[192, 168, 0, 38]
>>> 

不错。我_个人_会把它写成列表推导式,但那纯粹是口味问题。我喜欢使用“解码”和 “ord”。 - neil

5
您可能还需要使用chr函数:
chr(65) => 'A'

chr只接受整数,问题清楚地说明用户需要将十六进制转换为int/char(不是int转char),而chr只接受整数,因此这不是一个解决方案。 - jnhghy - Alexandru Jantea

3

将十六进制字符串转换为人类可读字符串,您可以对每个HEX字符进行转义,如下所示:

>>> '\x68\x65\x6c\x6c\x6f'
'hello'

从字符串中,你可以轻松地循环到整数列表:

>>> hextoint = [ord(c) for c in '\x68\x65\x6c\x6c\x6f']
>>> _
[104, 101, 108, 108, 111]

您的示例:

>>> [ord(c) for c in '\xC0\xA8\x00\x26']
[192, 168, 0, 38]

3
>>> htext='C0A80026'
>>> [int(htext[i:i+2],16) for i in range(0,len(htext),2)]
# [192, 168, 0, 38]

0

我希望这是你所期望的:

hex_val = 0x42424242     # hexadecimal value
int_val = int(hex_val)   # integer value
str_val = str(int_val)   # string representation of integer value

1
字面值 0x4242422 已经创建了一个整数,使用 int(hex_val) 是多余的。 - Cat Plus Plus

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