第一:计算方法理论、算法是如何理解的,如下:

VIN码各位数字的“对应值”:

0

1

2

3

4

5

6

7

8

9

0

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

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”

另外:VIN中不会包含 I、O、Q 三个英文字母

(因为字母I 与 数字1 太相似字母O 和Q与 数字0太相似 为了防止读错和混淆)

下面来看看JAVA和C++代码如何实现:

/**

* 检验VIN格式

* @param vin

* @return

*/

public  boolean checkVIN(String vin) {

Map vinMapWeighting = null;

Map vinMapValue = null;

vinMapWeighting = new HashMap();

vinMapValue = new HashMap();

vinMapWeighting.put(1, 8);

vinMapWeighting.put(2, 7);

vinMapWeighting.put(3, 6);

vinMapWeighting.put(4, 5);

vinMapWeighting.put(5, 4);

vinMapWeighting.put(6, 3);

vinMapWeighting.put(7, 2);

vinMapWeighting.put(8, 10);

vinMapWeighting.put(9, 0);

vinMapWeighting.put(10, 9);

vinMapWeighting.put(11, 8);

vinMapWeighting.put(12, 7);

vinMapWeighting.put(13, 6);

vinMapWeighting.put(14, 5);

vinMapWeighting.put(15, 4);

vinMapWeighting.put(16, 3);

vinMapWeighting.put(17, 2);

vinMapValue.put('0', 0);

vinMapValue.put('1', 1);

vinMapValue.put('2', 2);

vinMapValue.put('3', 3);

vinMapValue.put('4', 4);

vinMapValue.put('5', 5);

vinMapValue.put('6', 6);

vinMapValue.put('7', 7);

vinMapValue.put('8', 8);

vinMapValue.put('9', 9);

vinMapValue.put('A', 1);

vinMapValue.put('B', 2);

vinMapValue.put('C', 3);

vinMapValue.put('D', 4);

vinMapValue.put('E', 5);

vinMapValue.put('F', 6);

vinMapValue.put('G', 7);

vinMapValue.put('H', 8);

vinMapValue.put('J', 1);

vinMapValue.put('K', 2);

vinMapValue.put('M', 4);

vinMapValue.put('L', 3);

vinMapValue.put('N', 5);

vinMapValue.put('P', 7);

vinMapValue.put('R', 9);

vinMapValue.put('S', 2);

vinMapValue.put('T', 3);

vinMapValue.put('U', 4);

vinMapValue.put('V', 5);

vinMapValue.put('W', 6);

vinMapValue.put('X', 7);

vinMapValue.put('Y', 8);

vinMapValue.put('Z', 9);

boolean reultFlag = false;

String uppervin = vin.toUpperCase();

//排除字母O、I

if (vin == null || uppervin.indexOf("O") >= 0|| uppervin.indexOf("I") >= 0) {

reultFlag = false;

} else {

//1:长度为17

if (vin.length() == 17) {

char[] vinArr = uppervin.toCharArray();

int amount = 0;

for (int i = 0; i < vinArr.length; i++) {

//VIN码从从第一位开始,码数字的对应值×该位的加权值,计算全部17位的乘积值相加

amount += vinMapValue.get(vinArr[i])*vinMapWeighting.get(i + 1);

}

//乘积值相加除以11、若余数为10,即为字母X

if (amount % 11 == 10) {

if (vinArr[8] == 'X') {

reultFlag = true;

} else {

reultFlag = false;

}

} else {

//VIN码从从第一位开始,码数字的对应值×该位的加权值,

//计算全部17位的乘积值相加除以11,所得的余数,即为第九位校验值

if (amount % 11 != vinMapValue.get(vinArr[8])) {

reultFlag = false;

} else {

reultFlag = true;

}

}

}

//1:长度不为17

if (!vin.equals("") && vin.length() != 17) {

reultFlag = false;

}

}

return reultFlag;

}

下面来看看C++代码如何实现:#include#includestatic int weight_coefficient[17] = {8,7,6,5,4,3,2,10,'x',9,8,7,6,5,4,3,2};int VINCheck(const char *vin){uint8_t result = 0;int value_temp = 0;int step_temp = 0;for (int i=0; i!=17; ++i) {if (vin[i]>=0x30 && vin[i]<=0x39) { //Arabic numeralsvalue_temp = vin[i] - 0x30;} else if (vin[i]>=0x41 && vin[i]<=0x5A && vin[i]!=0x49&& vin[i]!=0x4F && vin[i]!=0x51) { //upper-romanif (vin[i]>=0x41 && vin[i]<=0x49)value_temp = vin[i] - 0x41 + 1;else if(vin[i]>=0x4A && vin[i]<=0x52)value_temp = vin[i] - 0x4A + 1;else if(vin[i]>=0x53 && vin[i]<=0x5A)value_temp = vin[i] - 0x53 + 2;} else {return false;}if (i != 8) {step_temp += value_temp*weight_coefficient[i];}}result = (uint8_t)(step_temp%11);if (result == 10) {result = 'X';} else {result += 0x30;}if (result != vin[8]) {return false;}return true;}int main(int argc, char **argv){std::cout << argv[1] << std::endl;int ret = VINCheck(argv[1]);std::cout << ret << std::endl;}

文档下载地址

http://download.csdn.net/detail/shenhonglei1234/9677969

车架号 生成 java_车辆识别码VIN校验位计算方法及实现  VIN号检验、车架号检验 java、 C++...相关推荐

  1. 车辆识别码VIN校验位计算方法及实现  VIN号检验、车架号检验 java、 C++

    第一:计算方法理论.算法是如何理解的,如下: VIN码各位数字的"对应值": 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 A B C D E F ...

  2. 车辆识别码VIN校验位计算方法及实现

    车辆识别码VIN校验工具 参考 GB16735-2019<道路车辆 车辆识别代号(VIN)> VIN组成 年份 校验位 代码 public class VinUtil {/*** 加权值. ...

  3. 车辆识别码VIN校验位计算方法及实现-Java

    校验规则: 校验码一共17位 校验码不包含 I(字母) Q O(字母) 第九位为校验位,只会出现0-9与X"" 第十位表示年份,不包括 0 I(字母) O(字母) Q U Z 12 ...

  4. 车辆VIN校验位计算方法 - Java及Python算法实现

    VIN码各位字符的对应数值: 字符 0 1 2 3 4 5 6 7 8 9 对应数值 0 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 ...

  5. 怎么实现微信公众号生成专属二维码推广来源统计

    为了实现微信公众号生成专属二维码推广来源统计功能,第三方平台微号帮提供了渠道二维码生成功能实现,可以给微信公众号在线生成专属推广二维码,统计公众号各个渠道来源的粉丝,一个渠道对应一个推广二维码,可以生 ...

  6. 电商平台订单号生成策略

    订单是整个电子商务的核心.整个电子商务的流程也是围绕订单的状态执行的.这篇博客主要向大家介绍订单号的生成方式. 现在大型电商网站大多都有好几种下单途径.比如:通过Web网站下单,通过打电话到呼叫中心下 ...

  7. 如何根据vin码查询_车架号查询-VIN查询-车辆识别码查询-宜配网

    请输入17位车架号码: 通过车架号查询车辆信息,在销售配件,二手车交易中十分重要,宜配网车架号在线查询系统,提供免费的车架号查询. 宜配网解码了全球大多数主流车型的车架号,宜配网车架号在线查询系统,不 ...

  8. 汽车Vin码识别/手机端扫描识别汽车车架号SDK

    关键词:行驶证Vin码识别 行驶证Vin码ocr识别 汽车Vin码ocr识别sdk 汽车Vin码识别 汽车车架号识别 手机扫描识别汽车Vin码 一.汽车Vin码识别/手机端扫描识别汽车车架号SDK应用 ...

  9. 最新VIN(车辆识别码)解析

    最新VIN(车辆识别码)解析  通过该接口vin即可查询车辆识别码对应的相关信息,厂商直连.车辆识别码车辆解析 http://www.haoservice.com/docs/104 请求参数:   名 ...

最新文章

  1. 学术-数学:哥德巴赫猜想
  2. 列表删除前面两个元素_第015篇:List列表 - 课程二
  3. Leetcode 137. 只出现一次的数字 II 解题思路及C++实现
  4. ucontext-人人都可以实现的简单协程库
  5. 何可欣(为奥运冠军名字作诗)
  6. html怎么设置锯齿边框样式,CSS3实现边框锯齿效果
  7. 2019幽门螺杆菌指南共识_《幽门螺杆菌感染基层诊疗指南(2019年)》发布! | 指南共识...
  8. 赛事招募 | 互联网创客马拉松开show啦~比武招APP
  9. Luogu5280 [ZJOI2019] 线段树 【线段树】
  10. Java SE 正则表达式 API Pattern 与 Matcher.
  11. c语言简单表白语言程序,c语言简单代码(c语言简单表白代码)
  12. HP大中华区总裁孙振耀退休感言
  13. 企微群机器人定时提醒
  14. [转]完美解决图片/链接虚线边框
  15. VisionMaster 4.0.0 的Modbus通信
  16. 鸿图霸业nbsp;谁与争锋
  17. 服装搭配app开发项目特点在这几个方面
  18. 业务系统遭黑客攻击,深信达MCK解决服务器的最后一米安全问题
  19. whistle 安装启动
  20. JOS学习笔记(五)

热门文章

  1. html5做宠物饲养,说一说最适合上班族养的十大宠物
  2. 幻立方解法之4阶,5阶,7阶
  3. 节假日判断工具(Java)
  4. 卸载有管理密码的瑞星企业版客户端
  5. ads1278_基于ADS1278的高精度微应变信号采集系统
  6. lightroom 闪退_苹果iPhone11手机APP频繁闪退怎么办?如何修复?
  7. random.shuffle(lst)
  8. 基础图像处理 python+opencv
  9. linux yum安装svn版本号,CentOS7 yum安装svn服务
  10. GII全球创新指数(2011-2018年)