Binary Maxmind的二进制DAT是如何工作的?

Binary Maxmind的二进制DAT是如何工作的?,binary,geolocation,packaging,geoip,copy-protection,Binary,Geolocation,Packaging,Geoip,Copy Protection,Maxmind提供二进制DAT文件格式,用于下载其GeoIP数据库 有人知道这是怎么包装的吗?此外,数据是否有任何类型的拷贝保护 我想以类似的方式提供一组数据 任何了解这一点的人都会得到我永恒的感谢:-)这只是一种专有的二进制格式,为IP地址查询进行了大量优化。它没有任何复制保护 如果您真的想对格式进行反向工程,请查看或API。我不知道这是否有帮助,但这里是GeoLite Country DB的PHP示例代码: const COUNTRY_BEGIN = 16776960; const COU

Maxmind提供二进制DAT文件格式,用于下载其GeoIP数据库

有人知道这是怎么包装的吗?此外,数据是否有任何类型的拷贝保护

我想以类似的方式提供一组数据


任何了解这一点的人都会得到我永恒的感谢:-)

这只是一种专有的二进制格式,为IP地址查询进行了大量优化。它没有任何复制保护


如果您真的想对格式进行反向工程,请查看或API。

我不知道这是否有帮助,但这里是GeoLite Country DB的PHP示例代码:

const COUNTRY_BEGIN = 16776960;
const COUNTRY_EDITION = 106;
const STANDARD_RECORD_LENGTH = 3;

public function Seek_Country($ip)
{
    $result = false;

    $databases = glob('./application/repository/GeoIP/GeoIP_*.dat');

    if (array_key_exists(0, $databases))
    {
        rsort($databases);

        if (!$handle = fopen($databases[0], 'rb'))
        {
            return $result;
        }

        $offset = 0;

        flock($handle, LOCK_SH);

        for ($depth = 31; $depth >= 0; --$depth)
        {
            fseek($handle, 2 * self::STANDARD_RECORD_LENGTH * $offset, SEEK_SET);

            $buffer = fread($handle, 2 * self::STANDARD_RECORD_LENGTH);

            $x = array(0, 0);

            for ($i = 0; $i < 2; ++$i)
            {
                for ($j = 0; $j < self::STANDARD_RECORD_LENGTH; ++$j)
                {
                    $x[$i] += ord($buffer[self::STANDARD_RECORD_LENGTH * $i + $j]) << ($j * 8);
                }
            }

            if ($ip & (1 << $depth))
            {
                if ($x[1] >= self::COUNTRY_BEGIN)
                {
                    $result = $x[1];

                    break;
                }

                $offset = $x[1];
            }

            else
            {
                if ($x[0] >= self::COUNTRY_BEGIN)
                {
                    $result = $x[0];

                    break;
                }

                $offset = $x[0];
            }
        }

        flock($handle, LOCK_UN);
        fclose($handle);
    }

    return $result;
}
const COUNTRY\u BEGIN=16776960;
const COUNTRY_EDITION=106;
常数标准记录长度=3;
国家/地区的公共职能(ip)
{
$result=false;
$databases=glob('./application/repository/GeoIP/GeoIP.*.dat');
如果(数组\键\存在(0,$databases))
{
rsort(数据库);
if(!$handle=fopen($databases[0],'rb'))
{
返回$result;
}
$offset=0;
羊群(把手、锁);
对于($depth=31;$depth>=0;--$depth)
{
fseek($handle,2*self::STANDARD\u RECORD\u LENGTH*$offset,SEEK\u SET);
$buffer=fread($handle,2*self::标准记录长度);
$x=数组(0,0);
对于($i=0;$i<2;++$i)
{
对于($j=0;$j