天天看點

車輛VIN碼的校驗算法

一、關于車輛的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);

}