php ip2long 出現負數原因及解決方法

2021-07-06 07:43:24 字數 2061 閱讀 7260

php提供了ip2long與long2ip方法對ip位址處理。

int ip2long ( string

$ip_address )

引數: ip_address 乙個標準格式的位址。

返回值: 返回ip位址轉換後的數字 或 false 如果 ip_address 是無效的。

string long2ip ( string

$proper_address )

引數: proper_address 長整型的正確位址表示。

返回值: 返回網際網路位址作為字串。

<?php

$ip = '10.1.1.1';

$ip_long = ip2long($ip);

echo

$ip_long.php_eol; // 167837953

echo long2ip($ip_long); // 10.1.1.1

?>

<?php

$ip = '192.168.101.100';

$ip_long = ip2long($ip);

echo

$ip_long.php_eol; // -1062705820

echo long2ip($ip_long); // 192.168.101.100

?>

原因說明:

ipv4使用無符號32位位址,因此最多有2的32次方減1(4294967295)個位址。書寫用4個小數點分開的10進製數。

記為a.b.c.d,例如:192.168.100.100。

ipv4位址每個10進製數都是無符號的位元組,範圍在0~255,將ipv4位址轉為無符號數,其實就是將每個10進製數放在對應的8位上,組成乙個4位元組的無符號整型。192.168.100.100,192,168在高8位100,100在低8位。

c實現的例子:

#include 

int main(int argc, char** argv)

fdipzone@ubuntu

:~/c

$ gcc -o ip2long ip2long.c

fdipzone@ubuntu

:~/c

$ ./ip2long

3232261220

-1062706076

可以看到,即使ip_long宣告是無符號整型,輸出時依然需要指明%u來格式化輸出為無符號整型。

因為192大於127(二進位制為01111111),192(8位)用二進位制表示,最高位必然是1。導致這個4位元組整型的最高位為1。

雖然ip_long定義為無符號整型,但printf方法是不理會宣告的。所以需要使用%u格式化來輸出。如果最高位是0,則使用%d即可。

另乙個例子:

ip:112.24.55.99

#include 

int main(int argc, char** argv)

fdipzone@ubuntu

:~/c

$ gcc -o ip2long ip2long.c

fdipzone@ubuntu

:~/c

$ ./ip2long

1880635235

1880635235

解決方法:

輸出時用%u來格式化為無符號整型。

<?php

$ip = '192.168.101.100';

$ip_long = sprintf('%u',ip2long($ip));

echo

$ip_long.php_eol; // 3232261476

echo long2ip($ip_long); // 192.168.101.100

?>

php手動實現ip2long和long2ip

php手動實現ip2long和long2ip 測試 public function testipaction 自己實現ip2long param ip return float int string protected function myip2long ip 將十進位制轉化為十六進製制 hex ...

python2中的long型別

數字型別 int和long 之所以要把int和long放在一起的原因是python3.x之後已經不區分int和long,統一用int。python2.x還是區分的。下面我以python2.7為例 i 10 type i type int i 10000000000 type i type long ...

Mac位址轉換成long長整型2

資料之間的轉換可以使用 system.convert mac位址轉換成long長整型 解析長整形的資料使其轉換為macid 長整形的資料 macid字串 public static string int64tomacid long valuetolong valuetostr string.join...