IP地址转换成Long型数字算法和原理(全网最细!!)

版权声明:本人版权所有,翻版必究!!!!! https://blog.csdn.net/qq_36968512/article/details/82494437

将ip地址转换成数字地址的时候是我做一个归属地查询的项目是碰见的,开始我并不明白将IP转换成数字地址的原理,可能老师上课讲了但是没有好好听,我觉得想理解下面算法就应该理解IP地址和数字地址的原理(菜鸟专用(^_^))

IP地址一般是一个32位的二进制数意思就是如果将IP地址转换成二进制表示应该有32为那么长,但是它通常被分割为4个“8位二进制数”(也就是4个字节每,每个代表的就是小于2的8 次方)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)

不知道各位理解了吗??
了解远离之后,其实有很多种算法能在ip地址和数字地址之间转换
我先介绍下通用的方法(菜鸟适用)

    val ipV4="125.213.100.123"
    val fragments = ip22.split("[.]")
    var Ip_Num=125*256*256*256+213*256*256+100*256+123
    println(Ip_Num)     //打印的结果2111136891

这里我介绍一个比较好用快速的方法(小牛适用)

    val ip22="125.213.100.123"
    val fragments = ip22.split("[.]")
    var Ip_Num = 0L
    for (i <- 0 until fragments.length){
      Ip_Num =  fragments(i).toLong | ipNum << 8L
    }
    println(Ip_Num)     //打印结果  2111136891

两次打印结果一致,说明ok,关于如何根据数字地址来求ip地址,大家可以思考下

第二个算法基础不太好的同志可能有点看不懂,其中“ | ”符号的含义就是将两个数字的二进制按右端对齐,只要有数字1就换1,当两个数字都是0才是0例如

202(二进制:11001010) |  163(10100011)可以像下面这样看   ==   235(11101011)
11001010
10100011
将有一的换成一,全是零的是零:11101011

然后是<<这个运算符号,这两个都是位运算符号,实例如下:

202(11001010)<<2 ==808(1100101000) 表示202的二进制数字在右端添加两个零所表示的数字
不知道大家看明白了没

建议码住,收藏起来没事看看,我觉得很细节

猜你喜欢

转载自blog.csdn.net/qq_36968512/article/details/82494437