5

有谁知道以开源/免费软件形式提供的 PHP、Perl 或 Python(或任何其他语言,我可以轻松转换代码)中的 ISO 3779 车辆 VIN 解码器库?

即使只是解码 WMI 部分(前 3 个位置)的东西也会为我节省很多时间。提前致谢。

http://en.wikipedia.org/wiki/Vehicle_identification_number

4

2 回答 2

6

我会让您从 Wikipedia 中抓取数据,但下面是一个您可以扩展的快速(模块化)示例(完成该WMI->Init()方法)。我也可能使VINLookup该类成为单例类或将 WMI 中断到数据库中(在某处规范化数据并将其视为基数 33 数字,就像我有 [可能])。

// http://en.wikipedia.org/wiki/Vehicle_identification_number#World_Manufacturer_Identifier

define('VIN_CHARACTERS', 'ABCDEFGHJKLMNPRSTUVWXYZ1234567890'); // no I, O or Q & 0 is last.

class WMI
{
  public $country;
  public $region;
  public $low;
  public $high;

  public function __construct($country,$region,$low,$high)
  {
    $this->country = $country;
    $this->region = $region;
    $this->low = $low;
    $this->high = $high;
  }

  private static function CodeToDec($code)
  {
    if (strlen($code) != 2)
      return false;

    return (strpos(VIN_CHARACTERS, $code{0}) * strlen(VIN_CHARACTERS)) + strpos(VIN_CHARACTERS, $code{1});
  }

  public function IsMatch($vin)
  {
    // first, grab the first 2 characters
    $code = substr($vin,0,2);

    // next, see if it's in range
    // we do this by converting it to a numeric
    $_low = WMI::CodeToDec($this->low);
    $_high = WMI::CodeToDec($this->high);
    $_code = WMI::CodeToDec($code);

    return (($_code >= $_low) && ($_code <= $_high));
  }

  public function __toString()
  {
    return sprintf("%s, %s (%s, %s)", $this->country, $this->region, $this->low, $this->high);
  }
}

class VINLookup
{
  private $vin;
  private $wmis = array();

  public function __construct($vin)
  {
    if (!VINLookup::IsValid($vin))
      throw new Exception('Invalid VIN specified');

    $this->vin = $vin;

    $this->Init();
  }

  private function Init()
  {
    $this->wmis = array(
      new WMI('South Africa',     'Africa',         'AA', 'AH'),
      new WMI('Ivory Coast',      'Africa',         'AJ', 'AN'),
      new WMI('(not assigned)',   'Africa',         'AP', 'A0'),
      new WMI('Angola',           'Africa',         'BA', 'BE'),
      new WMI('Kenya',            'Africa',         'BF', 'BK'),

      new WMI('United States',    'North America',  '1A', '10'),
      new WMI('Canada',           'North America',  '2A', '20'),
      new WMI('Mexico',           'North America',  '3A', '3W'),
      new WMI('Costa Rica',       'North America',  '3X', '37'),
    );
  }

  public function GetCountry()
  {
    foreach ($this->wmis as $wmi)
    {
      if ($wmi->IsMatch($this->vin))
        return $wmi;
    }
    return false;
  }

  public static function IsValid($vin)
  {
    return preg_match('/^[A-HJ-NPR-Z0-9]{17}$/',$vin);
  }
}

用法:

// check for a valid VIN number supplied
VINLookup::IsValid(<vin>);


// create a new VINLookup with the specified VIN
$lookup = new VINLookup(<vin>);

// retrieve the _Country_ object (above), or FALSE if no country match was found.
$lookup->GetCountry();
于 2011-06-01T21:27:22.300 回答
2

美国国家公路交通安全管理局拥有一个包含所有 WMI 编号的数据库。这是相关网页的链接:NHTSA WMI 数据

他们引用了一个包含数据的 ftp 站点:WMI 数据源

您可以下载 565.txt 文件或包含数据的 mdb 数据库。这似乎是一个非常完整的数据库。

于 2015-01-12T20:14:59.863 回答