将ip换算成整数php,如何将IP地址转换成为一个整数

请编写一个函数实现将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

总结,可以通过分步拆分,或者是位移的方式来进行解决这类问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值