thc*_*low 43 python networking ip-address
我的脚本有一点问题,我需要将表单'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`
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
fio*_*rix 83
#!/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
Run Code Online (Sandbox Code Playgroud)
mar*_*hor 39
Python 3有ipaddress模块,它具有非常简单的转换:
int(ipaddress.IPv4Address("192.168.0.1"))
str(ipaddress.IPv4Address(3232235521))
Run Code Online (Sandbox Code Playgroud)
Bru*_*elé 19
在纯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))
Run Code Online (Sandbox Code Playgroud)
结果:
192.168.0.1 -> 3232235521
3232235521 -> 192.168.0.1
Run Code Online (Sandbox Code Playgroud)
Thi*_*ter 12
你失去了左零填充,这会破坏你的字符串的解码.
这是一个工作功能:
def inttoip(ip):
return socket.inet_ntoa(hex(ip)[2:].zfill(8).decode('hex'))
Run Code Online (Sandbox Code Playgroud)
以下是最快,最直接(据我所知)IPv4和IPv6的转换器:
try:
_str = socket.inet_pton(socket.AF_INET, val)
except socket.error:
raise ValueError
return struct.unpack('!I', _str)[0]
-------------------------------------------------
return socket.inet_ntop(socket.AF_INET, struct.pack('!I', n))
-------------------------------------------------
try:
_str = socket.inet_pton(socket.AF_INET6, val)
except socket.error:
raise ValueError
a, b = struct.unpack('!2Q', _str)
return (a << 64) | b
-------------------------------------------------
a = n >> 64
b = n & ((1 << 64) - 1)
return socket.inet_ntop(socket.AF_INET6, struct.pack('!2Q', a, b))
Run Code Online (Sandbox Code Playgroud)
不使用inet_ntop()和struct模块的Python代码与此相比要慢几个数量级,无论它在做什么.
Python3 oneliner(基于 Thomas Webber 的 Python2 答案):
sum([int(x) << 8*i for i,x in enumerate(reversed(ip.split('.')))])
Run Code Online (Sandbox Code Playgroud)
左移比 pow() 快得多。
一条线
reduce(lambda out, x: (out << 8) + int(x), '127.0.0.1'.split('.'), 0)
Run Code Online (Sandbox Code Playgroud)
无需使用任何库即可完成此操作。
def iptoint(ip):
h=list(map(int,ip.split(".")))
return (h[0]<<24)+(h[1]<<16)+(h[2]<<8)+(h[3]<<0)
def inttoip(ip):
return ".".join(map(str,[((ip>>24)&0xff),((ip>>16)&0xff),((ip>>8)&0xff),((ip>>0)&0xff)]))
iptoint("8.8.8.8") # 134744072
inttoip(134744072) # 8.8.8.8
Run Code Online (Sandbox Code Playgroud)