php的IP轉換成整型函式

2021-09-02 19:33:21 字數 1562 閱讀 5117

php中將ip轉換成整型的函式ip2long()容易出現問題,在ip比較大的情況下,會變成負數,而達不到像mysql unet_aton方法的結果。

如下$ip = "192.168.1.2";

$ip_n = ip2long($ip);

echo $ip_n;      //得到 -1062731518

由於ip轉換成的整型值太大超出了整型的範圍,所以變成負數。需寫成$ip_n = bindec(decbin(ip2long($ip)));這樣便可得到無符號的整型數,如下

$ip = "192.168.1.2";

$ip_n = bindec(decbin(ip2long($ip)));

echo $ip_n;      //得到 3232235778

ps: 另乙個方法

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

如何將四個欄位以點分開的ip網路址協議位址轉換成整數呢?php裡有這麼乙個函式ip2long.比如

echo ip2long("10.2.1.3");

我們將得到

167903491

這是如何計算的,目前我知道有兩個演算法。其一

function ip2int($ip)

其二,用位運算

function ip2int($ip)

我們會發現,有些ip轉化成整數後,是負的,這是因為得到的結果是有符號整型,最大值是2147483647.要把它轉化為無符號的,可以用

sprintf("%u",ip2long($ip);

就能轉換為正整數。而且得到的結果用long2ip也可以正常轉換回原來的ip位址。也可以用ip2long來驗證乙個ip是否是有效的,如

function chk_ip($ip)

return true;

}//應用

var_export(chk_ip("10.111.149.42"));

var_export(chk_ip("10.111.256.42"));

將輸出true和false

把ip資料儲存在資料庫(mysql)中時候,我們習慣用ip2long函式生成整型,然後存放在乙個int(11)型別的字段中,但是,在不同的系統平台上,ip2long函式得到的值是不同的,因此可能造成在從資料庫中讀出資料,用long2ip得到ip的時候產生錯誤,說一下我們碰到的情況:

我們用乙個int(11)型別(範圍-2147483648 - 2147483647)來儲存把乙個ip位址用ip2long處理得到的結果,例如ip是』202.105.77.179′,那麼在32位機器上得到的結果是:-899068493,而在64位機器上卻得到3395898803.然後把它寫入資料庫,由於超過int(11)的範圍,因此64位機器上的結果被儲存為int(11)的最大值:2147483647.於是在從資料庫中取出的時候,便得到了錯誤的結果,會得到」127.255.255.255″這個ip位址.

解決的辦法很多,比如可以用mysql的函式:inet_aton和inet_ntoa來處理ip位址;或者把儲存ip位址的字段改為bigint型別,這樣在64位機器上雖然儲存的是3395898803,使用long2ip函式仍能得到正確的結果.

C語言 程式 字串轉換成整型,整型轉換成字串

atoi這個函式的實現要考慮正負還有字母等情況 下面是字串轉換成整型數 include include int my atio char string int main int my atio char string while string 0 string 0 string 9 判斷是否為0到9...

IP轉換成LONG 的 問題

如何將四個欄位以點分開的ip網路址協議位址轉換成整數呢?php裡有這麼乙個函式ip2long.比如 echo ip2long 10.2.1.3 我們將得到 167903491 這是如何計算的,目前我知道有兩個演算法。其一 function ip2int ip 其二,用位運算 function ip2...

字串轉換成整型int

atoi 函式用來將字串轉換成整數 int 其原型為 int atoi const char str 函式說明 atoi 函式會掃瞄引數 str 字串,跳過前面的空白字元 例如空格,tab縮排等,可以通過 isspace 函式來檢測 直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束時 0...