请编写一个函数实现将IP地址转换为一个整数.
首先要明白转换的思路.
IP地址是一个点分十进制的字符串例如:127.1.1.1
首先是将这个IP地址按照.进行分隔,然后每部分都表示成二进制形式.
最后再将这些二进制的字符串进行拼接,进而转换为int类型.
# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/19 8:37'
import socket
import struct
# IP地址转换为int
# 思路IP按照split进行分隔成4个部分,然后每个部分都转换为二进制类型.
# 然后将这些二进制进行拼接成一个32位的大的二进制字符串.
# 最后将这个二进制数,转换成对应的int类型
def ipToInt(ip_str):
# 分隔
ip_list = ip_str.split('.')
# 拼接
bin_str = ""
# 遍历,然后求出每一个二进制数,(注意切割,舍弃0b),还要把它弄成8位.再相加
for i in ip_list:
part = bin(int(i))[2:]
# 将part前面补充0
part = part.zfill(8)
bin_str += part
# 最后将这个二进制数转换为整数
ip_int = int(bin_str, 2)
return ip_int
# 另外一种方法,通过内置模块socket模块
def ipToInt2(ip_str):
# 首先将ip地址字符串转换为整型,使用inet_aton
ret = socket.ntohl(struct.unpack('I', socket.inet_aton(str(ip)))[0])
return ret
# 将int类型的数,先转换为32位的二进制数.然后按8位进行分隔.每八位表示一个IP的一部分即可.
def intToIp(ip_int):
ip_bin = bin(ip_int)[2:]
ip_bin = ip_bin.zfill(32)
bin_list = []
ip_str = []
for i in range(0, 32, 8):
bin_list.append(ip_bin[i:i + 8])
for temp in bin_list:
ip_str.append(str(int(temp, 2)))
ret = ".".join(ip_str)
return ret
# 第二种通过内置模块完成,将整型转换为IP地址格式地址
def intToIp2(ip):
ret = socket.inet_ntoa(struct.pack("I", socket.htonl(ip)))
return ret
if __name__ == '__main__':
ip = '7.91.205.21'
print(ipToInt(ip))
print(ipToInt2('7.91.205.21'))
print(intToIp(123456789))
print(intToIp2(123456789))
还有一种通过位移的方式
请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
def v1(addr):
# 取每个数
id = [int(x) for x in addr.split(".")]
print(id)
return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))
print(v1("127.0.0.1"))
# [127, 0, 0, 1]
# 2130706433
总结,可以通过分步拆分,或者是位移的方式来进行解决这类问题.