PHP中IP位址與整型數字互相轉換詳解

2022-10-06 11:51:15 字數 2845 閱讀 6039

ip轉換成整型儲存是資料庫優化一大趨勢,不程式設計客棧少人目前儲存ip時還在使用字串型別儲存,字串索引比整型索引消耗資源很多,特別是表中資料量大的時候,以及求查詢某乙個ip段的資料,今天說的ip是指ip4,ip6不在本文範圍內。

系統函式ip2long與long2ip

php中有內建函式ip2long可以將ip位址轉換整型。

複製** **如下:

$ip = '程式設計客棧210.110.11.49';

echo ip2long($ip);

輸出:複製** **如下:

-7645egnen40111

輸出的整型有負號是因為我們得到的結果是有符號整型,有符號整型最大值2147483647,要把結果轉換為無符號型可以這麼寫:

複製** **如下:

3530427185

使用long2ip把整型轉換回ip位址

複製** **如下:

$ip = '210.110.11.49';

$ip_int = ip2long($ip);

echo $ip."

";echo $ip_int."

";echo long2ip($ip_int);

輸出:複製** **如下:

210.110.11.49

-764540111

210.110.11.49

從結果可以看到,ip與整型可以通過函式完成。

系統函式小bug

這中bug網上一搜都是,大意說的是ip某段加個前導0,先來看看這個bug例項

複製** **如下:

$ip = '210.110.011.49';

$ip_int = ip2long($ip);

echo $ip."

";echo $ip_int."

";echo long2ip($ip_int);

輸出:複製** **如下:

210.110.011.49

-764540623

210.110.9.49

轉換結果不匹配,我們試著在ip第一段數字前加前導0,再看看

複製** **如下:

$ip = '021.110.11.49';

$ip_int = ip2long($ip);

echo $ip."

";echo $ip_int."

";echo lon

輸出:複製** **如下:

021.110.11.49

292424497

17.110.11.49

轉換結果都出錯。以上例子都是因為加了前導0後導致轉換結果出錯,連帶逆轉結果與原轉換ip不匹配。

轉換原理

目前有兩個演算法:

第一、第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最後總和

複製** **如下:

$ipegnen = '0210.110.11.49';

function iptoint($ip)

return $num;} 

echo  $ip.'

';$ip_int = iptoint($ip);

echo $ip_int.'

';echo long2ip($ip_int);

輸出:複製** **如下:

0210.110.11.49

3530427185

210.110.11.49

第二、通過位運算子

複製** **如下:

$ip = '0210.110.11.49';

function iptoint($ip)

echo  $ip.'

';$ip_int = iptoint($ip);

echo $ip_int.'

';echo long2ip($ip_int);

輸出:複製** **如下:

0210.110.11.49

-764540111

210.110.11.49

檢測ip是否合法

第一、自己遍歷檢測

複製** **如下:

function check_ip($ip)

return true;} 

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '

';echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

[code]

輸出:[code]

210.285.11.49,bool(false)

210.205.11.49,bool(true)

第二、使用ip2long返回

複製** **如下:

function check_ip($ip)

echo '210.285.11.49,';

var_dump(check_ip('210.285.11.49'));

echo '

';echo '210.205.11.49,';

var_dump(check_ip('210.205.11.49'));

輸出:複製** **如下:

210.285.11.49,bool(false)

210.205.11.49,bool(true)

後記不少人把ip寫庫用ip2long轉換存放int型別的字段中,但是,在不同的系統平台上,ip2long函式得到的值是不同的,因此可能造成在從資料庫中讀出資料逆轉ip時用long2ip得到的ip與原ip不符合

如果是mysql可以使用mysql系統函式inet_aton與inet_ntoa解決,或者使用bigint型別處理,要麼自己寫函式。

本文位址:

IP與數字互相轉換(PHP )

將ip轉換為數字 functionipton ip ipstr.iphex 將四段ip的16進製制數連線起來,得到乙個16進製制字串,長度為8 returnhexdec ipstr 將16進製制字串轉換成10進製,得到ip的數字表示 將數字轉換為ip,進行上面函式的逆向過程 functionntoi...

PHP實現IP 數字互相轉換

將ip轉換為數字 function ipton ip ipstr iphex 將四段ip的16進製制數連線起來,得到乙個16進製制字串,長度為8 return hexdec ipstr 將16進製制字串轉換成10進製,得到ip的數字表示 將數字轉換為ip,進行上面函式的逆向過程 function n...

python 整型與IP位址的轉換

1.strip 函式接受引數,可刪除兩邊的字元,例如 strip 0b 0和b是或的關係。在 中使用了lstrip 是因為bin函式進行轉換成二進位制數字時會自動新增0b 2.zfill的功能是將字串右對齊,前面用0補齊。3.中呼叫的方法對於引數有要求是字串或是整型的,這點需要注意轉換 實現 def...