4

Maxmindは、GeoIPデータベースをダウンロードするためのバイナリDATファイル形式を提供しています。

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

これがどのようにパッケージ化されているか知っている人はいますか?また、データに何らかのコピー防止機能はありますか?

同様の方法で一連のデータを提供したいと思います。

これについての知識を持っている人は誰でも私の不朽の感謝を受け取るでしょう:-)

4

2 に答える 2

1

これは独自のバイナリ形式であり、IPアドレスのクエリ用に大幅に最適化されています。コピー防止機能はありません。

本当にフォーマットをリバースエンジニアリングしたい場合は、C#またはJavaAPIを見てください。

于 2009-08-18T17:03:30.967 に答える
0

これが役立つかどうかはわかりませんが、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;
}
于 2009-09-07T01:12:28.003 に答える