如何判断一个IP地址是私有地址

       如何判断一个IP地址是私有地址,首先,我们得先了解什么是私有地址。本文所指的IP地址,皆是IPV4。

       一个IPV4地址,由四段组成,最大值为255,一个IP地址其实就是一个32位的bit串,每8位一段。所谓私有地址,就是非注册地址,只能做内网地址。私有地址有三类,分别是       A类 10.0.0.0 --10.255.255.255   B类 172.16.0.0--172.31.255.255   C类 192.168.0.0--192.168.255.255

      这里的划分规则是这样的,A类有一个8位的前缀,B类的前缀是12位,C类的前缀是16位,啥意思呢。就拿A类地址来说,前八位已经定下来了,就是10,后面的22位,随意变化,那么范围自然就是10.0.0.0到10.255.255.255了,B类地址前12位已经定下来了,第一个八位定为172,第二个八位的前4位定为16,他们的二进制表示是这样的

      第一段    10101100

      第二段    00010000

      第一段的8位加上第二段的前4位,这12位是固定下来的。那么后面的20位就是可以随便变化的,而第二段的后4位即便都是1,那么第二段的最大值也只能是00011111,也就是31,所以B类地址的第二段最大值就是31

      C类地址的前16位都固定了,就是192.168  


      明白了私有地址的范围,我们也就好计算了。一种方法,就是根据规则对字符串进行比较,用中间的点做分割,然后逐一对每段的值进行判断,然而本文要说的是另一个思路。

      我们可以把一个IP地址转成二进制,然后呢,每一类的地址的前面8,12,或16位其实是固定的,只要前面的这些位对得上,那么这个地址就是私有地址,程序用python编写,代码如下:

#coding=utf-8
'''
Created on 2015-11-28

@author: kwsy
'''
import socket
import struct

ip1 = 167772160
ip2 = 2886729728
ip3 = 3232235520


def isPrivateIp(ip):
    #将ip地址转换成二进制的形式
    binaryIp = socket.inet_aton(ip)
    #将二进制转成无符号long型
    numIp = struct.unpack('!L', binaryIp)[0]
    #32位都是1
    mark = 2**32-1
    #取numIP的前16位
    tag = (mark<<16) & numIp
    if ip3 ==tag:
        return True
    #取numIP的前12位
    tag = mark<<20 & numIp
    if ip2 == tag:
        return True
    #取numIP的前8位
    tag = (mark<<24) & numIp
    if ip1 == tag:
        return True
    return False

if __name__=='__main__':
    print(isPrivateIp('192.168.0.1'))
    

        相比对字符串分割然后逐一比较,是不是简单许多呢

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值