IP的獲取與轉換

2021-08-07 01:50:53 字數 1604 閱讀 6192

1、前言

ip轉換成整型儲存是資料庫優化一大趨勢,字串索引比整型索引消耗資源很多,特別是表中資料量大的時候,以及求查詢某乙個ip段的資料。本文所指的ip是ip4,ip6暫不再討論範圍

2、ip4轉化為整形

這裡將介紹:

2.1、ip2long

判斷乙個 ip4 位址是不是合法的 ip,符合則返回乙個長整型,不符合返回 false

以下是測試:

然而當 ip4 值較大時,ip2long轉化會出現負數的情況

2.2、php原生模擬ip2long的過程

php自帶的ip2long雖然好用,由於返回值是int,所以會造成資料溢位,比如有些ip位址轉換後變成負數,為了好看,還是需要自己模擬乙個ip2long的過程,不多說,先上**

function iptoint($ip) 

$hex = dechex($value);//

將十進位制轉為十六進製制

//每個ip段的值最大為255,十六進製制為ff,故最長是兩位,

//例ip = 1.1.1.1 如果不補0,則十六進製制為 1111,十進位制為 4369

//補0為 十六進製制為 01010101,十進位制為 16843009

if(strlen($hex) < 2

) $newhex .=$hex; }$

int = hexdec($newhex);//

十六進製制轉為十進位制

return $int

;}

以下是測試:

3、將整形轉化為ip

這裡將介紹:

3.1、long2ip

long2ip 只會返回0.0.0.0 到255.255.255.255的內容,

傳人空值預設返回0.0.0.0,超出最大值返回255.255.255.255

以下為測試:

long2ip可以識別由ip2long轉化產生的負數(可喜可賀);所有在使用過程中,ip2long和long2ip一起使用就不會有什麼問題,當然也要介紹一下如何用原生的模擬long2ip的過程

3.2、php原生模擬long2ip的過程

php自帶的long2ip已經可以解決大部分問題,這裡也只是簡單介紹一下原生的模擬方法,不多說,先上**

function inttoip($int

)

for($i = 0; $i < 8; $i += 2

) $aip = hexdec($hex); //

將每段十六進製制數轉換我為十進位制,即每個ip段的值

}

return implode('.'

,$aip);

}

以下為測試: 

4.1、ip2long

判斷乙個 ip4 位址是不是合法的 ip,符合則返回乙個長整型,不符合返回 false

詳情參考:

4.2、dechex

十進位制轉化為十六進製制(不用自己寫方法,爽)

詳情參考:

4.3、hexdec

十六進製制轉十進位制

詳情參考:

4.4、long2ip

將長整型轉化為 ip4 格式的字串,用於判斷乙個ip是否合法

詳情參考:

整數與IP位址的轉換

原理 ip位址的每段可以看成是乙個0 255的整數,把每段拆分成乙個二進位制形式組合起來,然後把這個二進位制數轉變成 乙個長整數。每段數字 相對應的二進位制數 10 00001010 0 00000000 3 00000011 193 11000001 組合起來即為 00001010 0000000...

Python獲取IP的方式與意義

使用 http x forwarded for 獲取到的ip位址,有以下幾種情況。沒有使用 伺服器 remote addr 您的 ip http via 沒數值或不顯示 http x forwarded for 無數值或不顯示 使用透明 伺服器 transparent proxies remote ...

整數與ip位址間的轉換

原理 ip位址的每段可以看成是乙個0 255的整數,把每段拆分成乙個二進位制形式組合起來,然後把這個二進位制數轉變成 乙個長整數。舉例 乙個ip位址為10.0.3.193 每段數字 相對應的二進位制數 10 00001010 0 00000000 3 00000011 193 11000001 組合...