一、關于車輛的VIN碼介紹: 直接百度
二、VIN碼的校驗位是第九位,對于第九位的計算方法如下:
2.1 内容的權值:VIN碼各位數字的“對應值”:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||||||||
A | B | C | D | E | F | G | H | J | K | L | M | N | P | R | S | T | U | V | W | X | Y | Z |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | 2 | 3 | 4 | 5 | 7 | 9 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
2.2 位置的權值: VIN碼從第1位到第17位的“權重值”:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
8 | 7 | 6 | 5 | 4 | 3 | 2 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
計算方法:
VIN碼從從第一位開始,碼數字的對應值×該位的權重值,計算全部17位的乘積值相加除以11,所得的餘數,即為第九位校驗值
例子:
車輛識别碼:UU6JA69691D713820第九位為9為校驗碼,我們可以驗證下是否正确。
4×8+4×7+6×6+1×5+1×4+6×3+9×2+6×10+1×9+4×8+7×7+1×6+3×5+8×4+2×3+0×0 = 350
350除以11,得31,餘9,該餘數9即為校驗碼,和識别碼的校驗位相同。如果餘數為10,則檢驗位為字母“X”
-----------------------------------我是分割線---------------------------------------
#include "stdio.h"
#define GD_OK 1
#define GD_ERR -1
int VinCalc(char *Vin,char *reslt)
{
unsigned int i = 0;
unsigned int sum =0;
unsigned int check = 0;
char temp=0;
unsigned int j = 0;
char jianquan[26][2] = {
{'A',1},{'B',2},{'C',3},{'D',4},{'E',5},{'F',6},
{'G',7},{'H',8},{'I',0},{'J',1},{'K',2},{'L',3},
{'M',4},{'N',5},{'O',0},{'P',7},{'Q',8},{'R',9},
{'S',2},{'T',3},{'U',4},{'V',5},{'W',6},{'X',7},
{'Y',8},{'Z',9}};
char pos[17]={8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2};
for(i=0;i<17;i++)
{
if(Vin[i]>='a'&&Vin[i]<='z')
{
temp = Vin[i]-0x20;
}
else if((Vin[i]>='A')&&(Vin[i]<='Z'))
{
temp = Vin[i];
}
else if((Vin[i]>='0')&&(Vin[i]<='9'))temp = Vin[i]-'0';
else return GD_ERR;
if((temp>='A')&&(temp<='Z'))
{
for(j=0;j<26;j++)
{
if(temp == jianquan[j][0])
temp = jianquan[j][1];
}
}
check += temp*pos[i];
}
*reslt = check%11;
return GD_OK;
}
void main(void)
{
char check = 0;
char* Vin="UU6JA69691D713820";
VinCalc(Vin,&check);
printf("校驗位是:%d",check);
}