The article first introduces the structure of the file content of Qqwry.dat and then according to its characteristics we can write read the contents of the Qqwry.dat IP library to find what we want.
First look at the content structure of the Qqwry.data file and how to interpret it.
I. Structure of the document
The file consists of three structures
1, file header, 8 bytes;
2, data record area, indefinite length;
3, the index area, the length is 7 integer times;
Second, the file header
The 8 bytes of the header are divided into two parts, each of which is 4 bytes, specifying the starting and ending addresses of the index area, respectively. So the total number of records can be calculated by adding 1 to the difference of two addresses except 7.
Second, the record area
The data of the record area needs to get the starting position of each data through the data of the index area, the end address and the region string of the IP address are recorded in this area, and all the region strings end in 0x00.
Third, the index area
The key to retrieving the IP corresponding region is to find the index content corresponding to the IP start address. An IP index data contains 7 bytes, the first 4 bytes is the IP address start value, the last 3 bytes is the corresponding IP data record in the file offset address; In an IP data record, the first 4 bytes are the IP end address; the data that follows is in two modes: 0x01 mode and 0x02 mode.
The 0x01 mode, that is, the 5th byte in the IP data is 0x01, then the 3 bytes in the back is the offset address of the national region data, and the country region data includes the country and region of the two strings. That
—————————————————————
4 bytes | 3-byte redirection 0x nn nn nn-zone data file offset address
—————————————————————
The 0x02 mode, that is, the 5th byte of the IP data is 0x02, then the 3 bytes in the back is the offset address of the national data, and the region data is then the string back to 0x00 as of. That
—————————————————————————–
4 bytes | File offset address for 3-byte redirect 0x nn nn nn-country data | Region String | 0x00
—————————————————————————–
For the national area data obtained by the 0x01 pattern, it may also have a redirect structure, i.e.
————————————–
Country String | 0x00 | Region String | 0x00
————————————–
Or
————————————————————————-
Country String | 0x00 | 0x02 | 3-byte 0x nn nn nn-zone string file offset address
————————————————————————-
For the former case, it is simpler to read the two string data directly; for the latter case, redirect the offset address to the region string again, and then read to 0x00 to the end of the string.
The main purpose of this approach is to avoid repeating record string values in a way that addresses map actual string values. In the entire IP address library file, there are too many identical string records, with a 3-byte mapping address to save too much space than the duplicate record string value.
PHP code read operation QQWry.dat file:
The code is as follows |
Copy Code |
function Bin2ip ($bin) { $ip = "; $BD = Str_split ($bin, 1); for ($i = 4; $i > 0; $i-) { $ip. = ".". sprintf ("%03d", implode (', unpack (' s '), $BD [$i-1]. chr (0))); } Return substr ($IP, 1); } //-------------------------------------------------- $f = fopen (' QQWry.Dat ', ' R '); $c = Fread ($f, 4); $d = Fread ($f, 4); $index _begin = implode (' ', Unpack (' L ', $c)); $index _end = implode (' ', Unpack (' L ', $d)); if ($index _begin < 0) $index _begin + = POW (2, 32); if ($index _end < 0) $index _end + = POW (2, 32); $ip _num = ($index _end-$index _begin)/7 + 1; echo "index begin at: $index _beginn"; echo "Index end at: $index _endn"; echo "IP data count: $ip _numn"; $output = "; for ($i = 0; $i < $ip _num; $i + +) { The file pointer refers to the index of each IP data file to get Index data (7 bytes) on Fseek ($f, $i * 7 + $index _begin); $ip 4 = fread ($f, 4); IP Start Address if (strlen ($ip 4) < 4) exit (' Data file error '); $ip 3 = fread ($f, 3); IP Record offset Address if (strlen ($ip 3) < 3) exit (' Data file error '); $dataseek = Implode (' ', Unpack (' L ', $ip 3. chr (0))); if ($dataseek < 0) $index _ip_record + = POW (2, 32); Find records $dataseek location to the record area Fseek ($f, $dataseek); $ipdata = Fread ($f, 4); IP End Address if (strlen ($ipdata) < 4) exit (' Data file error '); $area = "; $country = "; //Read a marker bit $flag = fread ($f, 1), if ($flag = Chr (1)) {//Country name offset mark bit mode one 0x01 $area 1seek = Fread ($f, 3); if ( strlen ($area 1seek) < 3) exit (' Data file error '); $area 1seek = implode (' ', Unpack (' L ', $area 1seek. chr (0))); Fseek ($f, $area 1seek); $flag = Fread ($f, 1);//May be the token bit } if ($flag = = Chr (2)) {//Country redirect $area 1seek = Fread ($f, 3); if (Strle N ($area 1seek) < 3) exit (' Data file error '); $area 1seek = implode (' ', Unpack (' L ', $area 1seek. chr (0))); $flag = Fread ($f, 1); if ($flag = Chr (2)) { $area 2seek = Fread ($f, 3), $area 2seek = Implode (", Unpack (' L ', $area 2seek. chr (0))); fseek ($f, $area 2seek); }else{ Fseek ($f, 1, seek_cur); } The while ($c = Fread ($f, 1))! = Chr (0)) $area. = $c; Fseek ($f, $area 1seek); The while ($c = Fread ($f, 1))! = Chr (0)) $country. = $c; }else{ Fseek ($f, 1, seek_cur), while (($c = Fread ($f, 1))! = Chr (0)) $country. = $c; $flag = Fread ($f, 1); If the region is redirected if ($flag = = Chr (2)) { $area 2seek = Fread ($f, 3); $area 2seek = implode (' ', Unpack (' L ', $area 2seek. chr (0))); Fseek ($f, $area 2seek); }else{ Fseek ($f,-1, seek_cur); } while ($c = Fread ($f, 1))! = Chr (0)) $area. = $c; } $adata = Trim ($country). Trim ($area); $country is the country string, $area is the region string } Fclose ($f); |
This function we see the most is the file operation related functions such as fopen,fseek,fread these, there is a need for friends to see.
http://www.bkjia.com/PHPjc/444691.html www.bkjia.com true http://www.bkjia.com/PHPjc/444691.html techarticle The article first introduces the structure of the file content of Qqwry.dat and then according to its characteristics we can write read the contents of the Qqwry.dat IP library to find what we want. First look at the Qqwry.data file ...