Discuz 5 0 中讀取純真IP資料函式分析

2021-04-16 07:32:18 字數 4758 閱讀 7759

discuz 5.0 中讀取純真ip資料庫函式分析

discuz  5.0 不在使用自己的ip資料,而是使用純真ip的資料格式, 訪問純真ip資料庫稍微有點麻煩,它的儲存格式比較特殊也很有趣,具體的格式分析參考下面兩個鏈結,其他語言實現參考文章末的鏈結。

《純真ip資料庫格式詳解》

鏈結一:http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx

鏈結二:http://lumaqq.linuxsir.org/article/qqwry_format_detail.html

純真ip資料庫官網:http://www.cz88.net/ip/

以下函式conrvertip()位於 discuz!5_gbk/upload/include/misc.func.php 路徑中,有興趣可以具體去閱讀分析。(下面**我做了簡單的修改,更便於閱讀,核心沒有修改)

//function

convertip(

$ip) .d.d.d$/",

$ip)) 

//開啟ip資料檔案if(

!$fd=@

fopen

($dat_path,'

rb'))//

分解ip進行運算,得出整形數

$ip=

explode('

.',$ip

);$ipnum

=$ip[0

] *16777216

+$ip[1

] *65536

+$ip[2

] *256+

$ip[3];

//獲取ip資料索引開始和結束位置

$databegin

=fread

($fd,4

);$dataend

=fread

($fd,4

);$ipbegin

=implode(''

,unpack('

l',$databegin

));if

($ipbegin

<0) 

$ipbegin

+=pow(2

,32);$ipend

=implode(''

,unpack('

l',$dataend

));if

($ipend

<0) 

$ipend

+=pow(2

,32);$ipallnum=(

$ipend

-$ipbegin) /

7+1;

$beginnum=0

;$endnum

=$ipallnum;//

使用二分查詢法從索引記錄中搜尋匹配的ip記錄

while

($ip1num

>

$ipnum

||$ip2num

<

$ipnum

) //

提取出來的資料轉換成長整形,如果資料是負數則加上2的32次冪

$ip1num

=implode(''

,unpack('

l',$ipdata1

));if

($ip1num

<0) 

$ip1num

+=pow(2

,32);//if(

$ip1num

>

$ipnum

) //

$dataseek

=fread

($fd,3

);if

(strlen

($dataseek

) <3) 

$dataseek

=implode(''

,unpack('

l',$dataseek

.chr(0

)));

fseek

($fd

,$dataseek

);$ipdata2

=fread

($fd,4

);if

(strlen

($ipdata2

) <4) 

$ip2num

=implode(''

,unpack('

l',$ipdata2

));if

($ip2num

<0) 

$ip2num

+=pow(2

,32);//

沒找到提示未知if(

$ip2num

<

$ipnum

) $beginnum

=$middle;}

}//下面的**讀暈了,沒讀明白,有興趣的慢慢讀

$ipflag

=fread

($fd,1

);if

($ipflag

==chr(1

)) $ipseek

=implode(''

,unpack('

l',$ipseek

.chr(0

)));

fseek

($fd

,$ipseek

);$ipflag

=fread

($fd,1

);}if(

$ipflag

==chr(2

)) $ipflag

=fread

($fd,1

);if

($ipflag

==chr(2

)) $addrseek2

=implode(''

,unpack('

l',$addrseek2

.chr(0

)));

fseek

($fd

,$addrseek2

);} 

else

while

(($char

=fread

($fd,1

)) !=

chr(0))

$ipaddr2

.=$char

;$addrseek

=implode(''

,unpack('

l',$addrseek

.chr(0

)));

fseek

($fd

,$addrseek

);while

(($char

=fread

($fd,1

)) !=

chr(0))

$ipaddr1

.=$char;} 

else

$addrseek2

=implode(''

,unpack('

l',$addrseek2

.chr(0

)));

fseek

($fd

,$addrseek2

);} 

else

while

(($char

=fread

($fd,1

)) !=

chr(0))

}fclose

($fd

);//

最後做相應的替換操作後返回結果if(

////  呼叫舉例(速度很快)

////********************====

echo

convertip(

'219.238.235.10');

//輸出: 北京市 電信通

echo

convertip(

'23.56.82.12');

//輸出:iana

echo

convertip(

'250.69.52.0');

//echo

convertip(

'238.69.52.0');

//echo

convertip(

'192.168.0.1');

//輸出:區域網 對方和您在同一內部網

echo

convertip(

'255.255.255.255');

//輸出:純真網路 2023年11月20日ip資料

?>

附:(相應其他實現程式)

利用 qqwry.dat 實現 ip 位址高效檢索(php)

)純真ip資料庫(qqwry.dat)查詢 c原始碼

Discuz 5 0 中讀取純真IP資料庫函式分析

discuz 5.0 不在使用自己的ip資料,而是使用純真ip的資料格式,訪問純真ip資料庫稍微有點麻煩,它的儲存格式比較特殊也很有趣,具體的格式分析參考下面兩個鏈結,其他語言實現參考文章末的鏈結。純真ip資料庫格式詳解 鏈結一 http blog.csdn.net heiyeshuwu archi...

50句話淺讀人生

1 蜘蛛 能坐享其成,靠的就是那張關係網。2 蝦 大紅之日,便是大悲之時。3 天平 誰多給一點,就偏向誰。4 瀑布 因居高臨下,才口若懸河。5 鋸子 伶牙俐齒,專做離間行為。6 氣球 只要被人一吹,便飄飄然了。7 鐘錶 可以回到起點,卻已不是昨天。8 核桃 沒有華麗的外表,卻有充實的大腦。9 指南針...

SQLSERVER中的邏輯讀與物理讀

在使用set statistics io on語句來統計sql語句或儲存過程的i o的時候,sqlserver會顯示邏輯讀與物理讀,那麼邏輯讀與物理讀是什麼意思呢?表 systempara 掃瞄計數 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0...