IP轉換成LONG 的 問題

2021-09-07 07:40:24 字數 1258 閱讀 2221

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

<?php

echo ip2long(

"10.2.1.3");

?>我們將得到

167903491

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

<?php

function ip2int($ip)

?>其二,用位運算

<?php

function ip2int($ip)

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

sprintf("%u

",ip2long($ip);

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

<?php

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函式仍能得到正確的結果.

long型別轉換成日期

description string型別毫秒數轉換成日期 param lo 毫秒數 return string yyyy mm dd hh mm ss public static string stringtodate string lo description long型別轉換成日期 param ...

將Long型別轉換成String型別

後端把long型別的資料傳給前端,前端可能會出現精度丟失的情況 方法一 在後台將這個long型別的字段轉換成string型別的。方法二 使用fastjson的提供的註解,jsonfield serializeusing tostringserializer.class 比如資料表字段為數字long型...

Mac位址轉換成long長整型2

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