1. 程式人生 > >IP地址轉換成Long型數字演算法和原理(全網最細!!)

IP地址轉換成Long型數字演算法和原理(全網最細!!)

將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的二進位制數字在右端新增兩個零所表示的數字
不知道大家看明白了沒

建議碼住,收藏起來沒事看看,我覺得很細節