Pymongo-ip 地址 string/int转换

0x00前言

  为了使得项目支持IP地址的C段查询,提高查询数据,计划先把IP地址”点分十进制”字符串表示转换为数值表示

0x01 利用inet_aton()函数:

1
2
3
4
5
6
def ip_to_int(ip):
return struct.unpack('!I', socket.inet_aton(ip))[0]


def int_to_ip(ip_int):
return socket.inet_ntoa(struct.pack('!L', ip_int))

0x02 原理分析:

IP地址是一个32位的二进制数,为了方便人们记忆,通常被分割为4个“8位二进制数”(也就是4个字节),称这种方式为“点分十进制”。
例:
IP地址11001010010111010111100000101101
点分十进制应该表示为202.93.120.45

ip字符串转换int

转换算法是:将ip字符串以“.”分割开为4个段存储于数组a[0],a[1],a[2],a[3](a[0]为左起第一段);转换结果为a[0]<<8*3+a[1]<<8*2+a[2]<<8*1+a[3]

ip int转换字符串(点分十进制)

转换算法为:i&0x000000ff+’.’+(i&0x0000ff00)>>8+’.’+(i&0x0000ff0000)>>16+’.’+(i&0xff000000)>>24

0x03 pymongo实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# !/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import struct
import pymongo


def ip_to_int(ip):
return struct.unpack('!I', socket.inet_aton(ip))[0]


def int_to_ip(ip_int):
return socket.inet_ntoa(struct.pack('!L', ip_int))


def main():
clint = pymongo.MongoClient('127.0.0.1', 27017)
db = clint.database_name # 修改为你的库名
#如果需要认证,把下面注释语句打开修改对应用户名密码即可
# db.authenticate('username', 'password')
collection = db.collection_name # 修改为你的集合名
for i in collection.find({}):
try:
collection.update({"ip": i["ip"]}, {"$set": {"ip": ip_to_int(i["ip"])}})
except Exception, e:
print e
print "finished"


if __name__ == '__main__':
main()