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...