使用Python将IP地址转换为十六进制

10

我正在编写一个将IP地址转换为十六进制的脚本。以下是我的脚本:

import string
ip = raw_input('Enter IP')
a = ip.split('.')
b = hex(int(a[0])) + hex(int(a[1])) + hex(int(a[2])) + hex(int(a[3]))
b = b.replace('0x', '')
b = b.upper()
print b

我遇到的问题是对于像115.255.8.97这样的IP地址,我得到的答案是:

回答:73FF861

期望答案:73FF0861

是否有聪明的人能够告诉我我在犯什么错误。

5个回答

14

hex函数不会在前面填充零。

>>> hex(8).replace('0x', '')
'8'

使用 str.format02X 格式规范:

>>> '{:02X}'.format(8)
'08'
>>> '{:02X}'.format(100)
'64'

>>> a = '115.255.8.97'.split('.')
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*map(int, a))
'73FF0861'

或者您可以使用binascii.hexlify + socket.inet_aton

>>> import binascii
>>> import socket
>>> binascii.hexlify(socket.inet_aton('115.255.8.97'))
'73ff0861'
>>> binascii.hexlify(socket.inet_aton('115.255.8.97')).upper()
'73FF0861'

这看起来非常不错。有没有一种方法可以输入多行作为raw_input()的输入? - user2922822
@user2922822,您可以迭代sys.stdin以获取所有行。或者重复调用raw_input() - falsetru

3
import socket, struct

# Convert a hex to IP
def hex2ip(hex_ip):
    addr_long = int(hex_ip,16)
    hex(addr_long)
    hex_ip = socket.inet_ntoa(struct.pack(">L", addr_long))
    return hex_ip

# Convert IP to bin
def ip2bin(ip):
    ip1 = '.'.join([bin(int(x)+256)[3:] for x in ip.split('.')])
    return ip1

# Convert IP to hex
def ip2hex(ip):
    ip1 = '-'.join([hex(int(x)+256)[3:] for x in ip.split('.')])
    return ip1

print hex2ip("c0a80100")
print ip2bin("192.168.1.0")
print ip2hex("192.168.1.0")

2
请不要提供裸代码答案。同时为代码的作用提供解释。 - Jonathan Mee
hex2ip(hex_ip) 将把十六进制转换为 IP,ip2bin(ip) 将把 IP 转换为二进制,ip2hex(ip) 将把 IP 转换为十六进制。 - user2968981

2

由于十六进制没有前导零,您可以使用zfill(2)

import string
ip = raw_input('Enter IP')
a = ip.split('.')
b = hex(int(a[0]))[2:].zfill(2) + hex(int(a[1]))[2:].zfill(2) + hex(int(a[2]))[2:].zfill(2) + hex(int(a[3]))[2:].zfill(2)
b = b.replace('0x', '')
b = b.upper()
print b

我们只提取十六进制数,使用[2:](删除“0x”),然后只在需要时添加2个前导零。
示例输出:
Enter IP 192.168.2.1
C0A80201

示例输出:

Enter IP 115.255.8.97
73FF0861

编辑1:

根据@volcano的要求,您可以使用列表推导式进行替换:

b = "".join([hex(int(value))[2:].zfill(2) for value in a])

哇,你真的把这全部打进去了。要不要试一下列表推导式? - volcano

1

-1
>>>import binascii
>>>import socket
>>>binascii.hexlify(socket.inet_aton('115.255.8.97'))
'73ff0861'
>>>binascii.hexlify(socket.inet_aton('10.255.8.97'))
'0aff0861'

在上面的IP转换为十六进制的输出中,如果输出以'0'开头,例如0aff0861,那么我想删除0并且输出应该看起来像aff0861。是否有任何直接的方法可用于转换?

你能把你的问题写成注释吗?问题作为答案会给读者带来误导。(至少我被误导了;)) - tssch

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