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