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

Posted

技术标签:

【中文标题】Maxmind 的二进制 DAT 是如何工作的?【英文标题】:How does the binary DAT from Maxmind work? 【发布时间】:2009-08-18 16:12:48 【问题描述】:

Maxmind 提供二进制 DAT 文件格式来下载他们的 GeoIP 数据库。

http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

有人知道这个是怎么打包的吗?另外,数据是否有任何形式的复制保护?

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

任何对此有任何了解的人都会得到我永恒的感激:-)

【问题讨论】:

【参考方案1】:

它只是一种专有的二进制格式,针对 IP 地址查询进行了高度优化。它没有任何复制保护。

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

【讨论】:

【参考方案2】:

我不知道这是否有帮助,但这里是 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;

【讨论】:

以上是关于Maxmind 的二进制 DAT 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC - 加载 Maxmind dat 文件

NGINX ngx_http_geoip_module,支持 MaxMind .dat 和 .mmdb IP 数据库

如何使用 Play Framework 的 SBT 下载 Maxmind 数据库

如何使用 vb.net 从 maxmind GeoIP ISP.data 获取 ISP

PHP 从 IP 地址获取位置 MaxMind GEOIP

15. Nginx Geo