在Python中将IP字符串转换为整数及反向转换
我在我的脚本中遇到一个小问题,我需要把形如 '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