| mendapati bahawa terdapat tempat yang saya benar-benar tidak dapat memahami : if($ipbegin < 0) $ipbegin += pow(2, 32); Masalah lain ialah: fungsi ini merujuk kepada qqwry dat (hampir ditulis sebagai kelawar pada mulanya). , hanya ada pengenalan ringkas, tetapi saya masih tidak menemuinya Jawapan yang anda mahukan.
fungsi awam qqwry($ip='222.222.222.222'){
//$fd->sumber(24, strim)
if(!$fd = @fopen("./Public/qqwry.dat", 'rb')) {
kembalikan 'Fail data IP tidak sah';
}
$ip = meletup('.', $ip);
//$ipNum=2079656996
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
//Dapatkan kedudukan mula dan akhir indeks alamat IP Pada masa ini, output kedua-dua pembolehubah adalah bercelaru (sepatutnya binari).
if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ){
kembali;
}
// Fungsi unpack() membongkar data daripada rentetan binari, L--integer panjang tidak ditandatangani
// implode — Sertai elemen tatasusunan dengan (ke) rentetan
@$ipbegin = meletup('', unpack('L', $DataBegin));// 6153398
//pow(x,y)--Fungsi pow() mengembalikan x dinaikkan kepada kuasa ke-y.
if($ipbegin < 0) $ipbegin += pow(2, 32); // Dalam keadaan apakah $ipbegin<0 ???
// implode — Sertai elemen tatasusunan dengan (ke) rentetan
@$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
$BeginNum = $ip2num = $ip1num = 0;
$ipAddr1 = $ipAddr2 = '';
$EndNum = $ipAllNum;
while($ip1num > $ipNum || $ip2num < $ipNum) {
//Berikut ialah bahagian besar dikotomi, jadi saya tidak akan menyalinnya
IP dinyatakan dalam binari sebagai 32bit, jadi int juga 32bit Gunakan nombor untuk menyimpan IP, yang mempunyai kecekapan carian dan ruang penyimpanan yang lebih baik
int mewakili positif dan negatif. Jadi adalah perkara biasa untuk mempunyai nombor negatif