2009-08-18 4 views

Antwort

1

Es ist nur ein proprietäres Binärformat, optimiert stark für die IP-Adresse anfragende. Es hat keinen Kopierschutz.

Wenn Sie das Format wirklich reverse-engineeren möchten, werfen Sie einen Blick auf die API C# oder Java.

0

Ich weiß nicht, ob das hilft, aber hier ist es ein Beispielcode in PHP für das Land GeoLite DB:

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; 
} 
Verwandte Themen