在Python中将IP字符串转换为整数及反向转换

62 投票
13 回答
106700 浏览
提问于 2025-04-16 15:29

我在我的脚本中遇到一个小问题,我需要把形如 'xxx.xxx.xxx.xxx' 的IP地址转换成整数形式,然后再从这个整数形式转换回去。

def iptoint(ip):
    return int(socket.inet_aton(ip).encode('hex'),16)

def inttoip(ip):
    return socket.inet_ntoa(hex(ip)[2:].decode('hex'))


In [65]: inttoip(iptoint('192.168.1.1'))
Out[65]: '192.168.1.1'

In [66]: inttoip(iptoint('4.1.75.131'))
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)

/home/thc/<ipython console> in <module>()

/home/thc/<ipython console> in inttoip(ip)

error: packed IP wrong length for inet_ntoa`

有没有人知道怎么解决这个问题?

13 个回答

28

在纯Python中,不使用额外的模块

def IP2Int(ip):
    o = map(int, ip.split('.'))
    res = (16777216 * o[0]) + (65536 * o[1]) + (256 * o[2]) + o[3]
    return res


def Int2IP(ipnum):
    o1 = int(ipnum / 16777216) % 256
    o2 = int(ipnum / 65536) % 256
    o3 = int(ipnum / 256) % 256
    o4 = int(ipnum) % 256
    return '%(o1)s.%(o2)s.%(o3)s.%(o4)s' % locals()

# Example
print('192.168.0.1 -> %s' % IP2Int('192.168.0.1'))
print('3232235521 -> %s' % Int2IP(3232235521))

结果:

192.168.0.1 -> 3232235521
3232235521 -> 192.168.0.1
100

Python 3 有一个叫做 ipaddress 的模块,它可以很简单地进行转换:

int(ipaddress.IPv4Address("192.168.0.1"))
str(ipaddress.IPv4Address(3232235521))
115

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种时候,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。在这些论坛上,很多人会分享他们的经验和解决方案。

比如,有人可能会问:“我在运行我的程序时遇到了一个错误,应该怎么解决?”然后其他人就会根据他们的经验,给出一些建议,比如检查代码的某一部分,或者尝试用不同的方法来解决问题。

总之,技术论坛是一个很好的地方,可以让我们学习到很多解决问题的方法,也能让我们更好地理解编程的各种细节。

#!/usr/bin/env python
import socket
import struct


def ip2int(addr):
    return struct.unpack("!I", socket.inet_aton(addr))[0]


def int2ip(addr):
    return socket.inet_ntoa(struct.pack("!I", addr))


print(int2ip(0xc0a80164)) # 192.168.1.100
print(ip2int('10.0.0.1')) # 167772161

撰写回答