Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将IP字符串转换为数字,反之亦然_Python_Django - Fatal编程技术网

Python 将IP字符串转换为数字,反之亦然

Python 将IP字符串转换为数字,反之亦然,python,django,Python,Django,如何使用python将作为str的IP地址转换为十进制数,反之亦然 例如,对于IP186.99.109.000,我希望有一个易于存储在数据库中的十进制或二进制格式,然后检索它。将IP字符串转换为长整数: import socket, struct def ip2long(ip): """ Convert an IP string to long """ packedIP = socket.inet_aton(ip) return struct.unpac

如何使用python将作为
str
的IP地址转换为十进制数,反之亦然


例如,对于IP
186.99.109.000
,我希望有一个易于存储在数据库中的十进制或二进制格式,然后检索它。

将IP字符串转换为长整数:

import socket, struct

def ip2long(ip):
    """
    Convert an IP string to long
    """
    packedIP = socket.inet_aton(ip)
    return struct.unpack("!L", packedIP)[0]
反过来说:

>>> socket.inet_ntoa(struct.pack('!L', 2130706433))
'127.0.0.1'

将IP字符串转换为长整数:

import socket, struct

def ip2long(ip):
    """
    Convert an IP string to long
    """
    packedIP = socket.inet_aton(ip)
    return struct.unpack("!L", packedIP)[0]
反过来说:

>>> socket.inet_ntoa(struct.pack('!L', 2130706433))
'127.0.0.1'
以下是一行答案:


执行时间: ip2long_1=>0.0527065660363234(最佳)
ip2long_2=>0.577211893924598
ip2long_3=>0.5552745958088666

以下是一行答案:
def ip2Hex(ip = None):
    '''Returns IP in Int format from Octet form'''
    #verifyFormat(ip)
    digits=ip.split('.')
    numericIp=0
    count=0
    for num in reversed(digits):
        print "%d " % int(num)
        numericIp += int(num) * 256 **(count)
        count +=1
    print "Numeric IP:",numericIp
    print "Numeric IP Hex:",hex(numericIp)

ip2Hex('192.168.192.14')
ip2Hex('1.1.1.1')
ip2Hex('1.0.0.0')



执行时间: ip2long_1=>0.0527065660363234(最佳)
ip2long_2=>0.577211893924598

ip2long_3=>0.5552745958088666

以下是截至2017-06年所有选项的总结。所有模块都是标准库的一部分,或者可以通过
pip install
安装

def ip2Hex(ip = None):
    '''Returns IP in Int format from Octet form'''
    #verifyFormat(ip)
    digits=ip.split('.')
    numericIp=0
    count=0
    for num in reversed(digits):
        print "%d " % int(num)
        numericIp += int(num) * 256 **(count)
        count +=1
    print "Numeric IP:",numericIp
    print "Numeric IP Hex:",hex(numericIp)

ip2Hex('192.168.192.14')
ip2Hex('1.1.1.1')
ip2Hex('1.0.0.0')
IP地址模块 模块ipaddress()自v3.3起就是标准库的一部分,但它也可以作为python v2.6、v2.7的外部模块提供

>>> import ipaddress
>>> int(ipaddress.ip_address('1.2.3.4'))
16909060
>>> ipaddress.ip_address(16909060).__str__()
'1.2.3.4'
>>> int(ipaddress.ip_address(u'1000:2000:3000:4000:5000:6000:7000:8000'))
21268296984521553528558659310639415296L
>>> ipaddress.ip_address(21268296984521553528558659310639415296L).__str__()
u'1000:2000:3000:4000:5000:6000:7000:8000'
无模块导入(仅限IPv4) 没有要导入的内容,但仅适用于IPv4,并且代码比任何其他选项都长

>>> ipstr = '1.2.3.4'
>>> parts = ipstr.split('.')
>>> (int(parts[0]) << 24) + (int(parts[1]) << 16) + \
          (int(parts[2]) << 8) + int(parts[3])
16909060
>>> ipint = 16909060
>>> '.'.join([str(ipint >> (i << 3) & 0xFF)
          for i in range(4)[::-1]])
'1.2.3.4'
模块套接字和结构(仅限ipv4) 这两个模块都是标准库的一部分,代码很短,有点神秘,并且仅限于IPv4

>>> import socket, struct
>>> ipstr = '1.2.3.4'
>>> struct.unpack("!L", socket.inet_aton(ipstr))[0]
16909060
>>> ipint=16909060
>>> socket.inet_ntoa(struct.pack('!L', ipint))
'1.2.3.4'

以下是截至2017-06年所有选项的摘要。所有模块都是标准库的一部分,或者可以通过
pip install
安装

IP地址模块 模块ipaddress()自v3.3起就是标准库的一部分,但它也可以作为python v2.6、v2.7的外部模块提供

>>> import ipaddress
>>> int(ipaddress.ip_address('1.2.3.4'))
16909060
>>> ipaddress.ip_address(16909060).__str__()
'1.2.3.4'
>>> int(ipaddress.ip_address(u'1000:2000:3000:4000:5000:6000:7000:8000'))
21268296984521553528558659310639415296L
>>> ipaddress.ip_address(21268296984521553528558659310639415296L).__str__()
u'1000:2000:3000:4000:5000:6000:7000:8000'
无模块导入(仅限IPv4) 没有要导入的内容,但仅适用于IPv4,并且代码比任何其他选项都长

>>> ipstr = '1.2.3.4'
>>> parts = ipstr.split('.')
>>> (int(parts[0]) << 24) + (int(parts[1]) << 16) + \
          (int(parts[2]) << 8) + int(parts[3])
16909060
>>> ipint = 16909060
>>> '.'.join([str(ipint >> (i << 3) & 0xFF)
          for i in range(4)[::-1]])
'1.2.3.4'
模块套接字和结构(仅限ipv4) 这两个模块都是标准库的一部分,代码很短,有点神秘,并且仅限于IPv4

>>> import socket, struct
>>> ipstr = '1.2.3.4'
>>> struct.unpack("!L", socket.inet_aton(ipstr))[0]
16909060
>>> ipint=16909060
>>> socket.inet_ntoa(struct.pack('!L', ipint))
'1.2.3.4'

由于Python3.3,有一个ipaddress模块正好完成这项工作。PyPI上也提供了Python2.x的后端口

用法示例:

import ipaddress

ip_in_int = int(ipaddress.ip_address('192.168.1.1'))
ip_in_hex = hex(ipaddress.ip_address('192.168.1.1'))

由于Python3.3,有一个ipaddress模块正好完成这项工作。PyPI上也提供了Python2.x的后端口

用法示例:

import ipaddress

ip_in_int = int(ipaddress.ip_address('192.168.1.1'))
ip_in_hex = hex(ipaddress.ip_address('192.168.1.1'))

在模块
netaddr
中使用class
IPAddress

ipv4
str
->
int

print int(netaddr.IPAddress('192.168.4.54'))
# OUTPUT: 3232236598
print int(netaddr.IPAddress('2001:0db8:0000:0000:0000:ff00:0042:8329'))
# OUTPUT: 42540766411282592856904265327123268393
ipv4
int
->
str

print str(netaddr.IPAddress(3232236598))
# OUTPUT: 192.168.4.54
print str(netaddr.IPAddress(42540766411282592856904265327123268393))
# OUTPUT: 2001:db8::ff00:42:8329
ipv6
str
->
int

print int(netaddr.IPAddress('192.168.4.54'))
# OUTPUT: 3232236598
print int(netaddr.IPAddress('2001:0db8:0000:0000:0000:ff00:0042:8329'))
# OUTPUT: 42540766411282592856904265327123268393
ipv6
int
->
str

print str(netaddr.IPAddress(3232236598))
# OUTPUT: 192.168.4.54
print str(netaddr.IPAddress(42540766411282592856904265327123268393))
# OUTPUT: 2001:db8::ff00:42:8329

在模块
netaddr
中使用class
IPAddress

ipv4
str
->
int

print int(netaddr.IPAddress('192.168.4.54'))
# OUTPUT: 3232236598
print int(netaddr.IPAddress('2001:0db8:0000:0000:0000:ff00:0042:8329'))
# OUTPUT: 42540766411282592856904265327123268393
ipv4
int
->
str

print str(netaddr.IPAddress(3232236598))
# OUTPUT: 192.168.4.54
print str(netaddr.IPAddress(42540766411282592856904265327123268393))
# OUTPUT: 2001:db8::ff00:42:8329
ipv6
str
->
int

print int(netaddr.IPAddress('192.168.4.54'))
# OUTPUT: 3232236598
print int(netaddr.IPAddress('2001:0db8:0000:0000:0000:ff00:0042:8329'))
# OUTPUT: 42540766411282592856904265327123268393
ipv6
int
->
str

print str(netaddr.IPAddress(3232236598))
# OUTPUT: 192.168.4.54
print str(netaddr.IPAddress(42540766411282592856904265327123268393))
# OUTPUT: 2001:db8::ff00:42:8329

不带任何模块导入的单线解决方案:

ip2int = lambda ip: reduce(lambda a, b: (a << 8) + b, map(int, ip.split('.')), 0)
int2ip = lambda n: '.'.join([str(n >> (i << 3) & 0xFF) for i in range(0, 4)[::-1]])

不带任何模块导入的单线解决方案:

ip2int = lambda ip: reduce(lambda a, b: (a << 8) + b, map(int, ip.split('.')), 0)
int2ip = lambda n: '.'.join([str(n >> (i << 3) & 0xFF) for i in range(0, 4)[::-1]])

将IP转换为整数:

python -c "print sum( [int(i)*2**(8*j) for  i,j in zip( '10.20.30.40'.split('.'), [3,2,1,0]) ] )"
将INTEGER转换为IP:

python -c "print '.'.join( [ str((169090600 >> 8*i) % 256)  for i in [3,2,1,0] ])" 

将IP转换为整数:

python -c "print sum( [int(i)*2**(8*j) for  i,j in zip( '10.20.30.40'.split('.'), [3,2,1,0]) ] )"
将INTEGER转换为IP:

python -c "print '.'.join( [ str((169090600 >> 8*i) % 256)  for i in [3,2,1,0] ])" 
这里有一个

def ipv4_to_int(ip):
    octets = ip.split('.')
    count = 0
    for i, octet in enumerate(octets):
        count += int(octet) << 8*(len(octets)-(i+1))
    return count
def ipv4到int(ip):
八位字节=ip.split('.'))
计数=0
对于i,枚举中的八位字节(八位字节):
count+=int(八位组)这里有一个

def ipv4_to_int(ip):
    octets = ip.split('.')
    count = 0
    for i, octet in enumerate(octets):
        count += int(octet) << 8*(len(octets)-(i+1))
    return count
def ipv4到int(ip):
八位字节=ip.split('.'))
计数=0
对于i,枚举中的八位字节(八位字节):

count+=int(八位字节)如果您的ip地址位于数据帧中,则可以使用库中的函数
clean\u ip
。使用
pip安装DataPrep
安装DataPrep

从dataprep.clean导入clean\u ip
df=pd.DataFrame({“ip”:[“186.99.109.000”,“127.0.0.1”,“1.2.3.4”]})
要转换为十进制格式,请将参数
output\u format
设置为
“integer”

df2=clean_ip(df,“ip”,输出格式=“整数”)
#打印(df2)
ip_清洁
0  186.99.109.000  3127078144
1       127.0.0.1  2130706433
2         1.2.3.4    16909060
要转换为二进制格式,请将参数
output\u format
设置为
“binary”

df2=clean_ip(df,“ip”,输出格式=“二进制”)
#打印(df2)
ip_清洁
0  186.99.109.000  10111010011000110110110100000000
1       127.0.0.1  01111111000000000000000000000001
2         1.2.3.4  00000001000000100000001100000100
要转换回IPv4,请将参数
output\u format
设置为
“compressed”

df=pd.DataFrame({“ip”:[3120778144213070643316909060]})
df2=干净的ip(df,“ip”,输出格式=“压缩”)
#打印(df2)
ip_清洁
0  3127078144  186.99.109.0
1  2130706433     127.0.0.1
2    16909060       1.2.3.4

如果您的ip地址位于数据帧中,则可以使用库中的功能
清除ip
。使用
pip安装DataPrep
安装DataPrep

从dataprep.clean导入clean\u ip
df=pd.DataFrame({“ip”:[“186.99.109.000”,“127.0.0.1”,“1.2.3.4”]})
要转换为十进制格式,请将参数
output\u format
设置为
“integer”

df2=clean_ip(df,“ip”,输出格式=“整数”)
#打印(df2)
ip_清洁
0  186.99.109.000  3127078144
1       127.0.0.1  2130706433
2         1.2.3.4    16909060
要转换为二进制格式,请将参数
output\u format
设置为
“binary”

df2=clean_ip(df,“ip”,输出格式=“二进制”)
#打印(df2)
ip_清洁
0  186.99.109.000  10111010011000110110110100000000
1       127.0.0.1  01111111000000000000000000000001
2         1.2.3.4  00000001000000100000001100000100
要转换回IPv4,请将参数
output\u format
设置为
“compressed”

df=pd.DataFrame({“ip”:[3120778144213070643316909060]})
df2=清洁ip(df,“ip”,输出