汽车分类及VIN码
前几天下班路上随手看看有什么书好看, 看到一本汽车的书想起来自己对车什么都不懂, 虽然驾照都拿了6年了, 还是对车没什么情绪, 就翻了翻,了解下常识。
- 《汽车结构及拆装》
- https://en.wikipedia.org/wiki/Vehicle_identification_number#List_of_common_WMI WMI
- https://zh.wikipedia.org/zh-cn/%E8%BB%8A%E8%BC%9B%E8%AD%98%E5%88%A5%E8%99%9F%E7%A2%BC
- https://www.jianshu.com/p/a1d4524c6b99
汽车分类原则
在我国,轿车按照发动机排量划分为:微型轿车(排量在1L以下)、普通轿车(排量为1.0~1.6L)、中级轿车(排量为1.6~2.5L)、中高级轿车(排量为2.5~4.0L)、高级轿车(排量在4L以上)。
汽车的分类标准
我国汽车主要分为载货汽车、越野汽车、自卸汽车、牵引车、专用汽车、客车、轿车、半挂车等几种类型。- 载货汽车主要有微型货车、轻型货车、中型货车、重型货车。
- 越野汽车主要有轻型越野车、中型越野车、重型越野车、超重型越野车。
- 自卸汽车主要有轻型自卸车、中型自卸车、重型自卸车、矿用自卸车。
- 牵引车主要有半挂牵引车、全挂牵引车。
- 专用汽车主要有厢式汽车、罐式汽车、起重举升车、仓栅式车、特种结构车、专用自卸车。
- 客车主要有微型客车、轻型客车、中型客车、大型客车、特大型客车。
- 轿车主要有微型轿车、普通轿车、中级轿车、中高级轿车、高级轿车。
- 半挂车主要有轻型半挂车、中型半挂车、重型半挂车、超重型半挂车。
欧系分类
德国大众是欧洲最大的汽车制造商,也是最早进入中国轿车市场的企业,它的轿车分类法具有代表性。德国轿车分为A、B、C、D级。- A级车又可分为A00、A0级车,相当于我国微型轿车和普通轿车。
- B级车和C级车分别相当于我国的中级轿车和中高级轿车。
- D级车相当于我国红旗等高档轿车。该级别车的轴距越长,排量和重量越大,轿车的豪华程度也越高。
车尾的字母有G、GL、GLS等,通常G表示基本型,GL表示豪华型,GLS表示顶级车。
- 美系分类
对美系分类标准,通用公司一般将轿车分为6级,这是综合考虑了车型尺寸、排量、装备和售价之后得出的分类。其中,Mini相当于我国的微型轿车;我国的普通轿车在通用公司分类中可找到2个级别,即Small和LowMed;中级轿车即Interm(B级);中高级轿车即UppMed;高级轿车对应的是Large/Lux级别。 功能划分
按照功能性划分为房车、旅行轿车、轿跑车、跑车、敞篷车等车型。按照车型布置划分为四门五座、五门掀背、双门双座、双门五座软顶等。- A00级轿车的轴距为2~2.2m,发动机排量小于1L,如奥拓就属于A00级轿车。
- A0级轿车的轴距为2.3~2.45m,排量为1~1.3L,比较典型的是两厢夏利轿车。
- A级车轴距范围为2.45~2.65m,排量在1.3~1.6L,一汽大众的捷达、上海大众的POLO都属于A级车。
- B级轿车轴距为2.6~2.75m,排量为1.6~2.4L。B级车市场逐渐成为国内汽车企业拼杀的主战场,如奥迪A4、帕萨特、中华、东方之子等众多车型均属于B级车阵营。
- C级轿车的轴距为2.7~2.8m,发动机排量为2.3~3.0L,国内名气最大的C级车非奥迪A6莫属。
- D级轿车大多外形气派,车内空间极为宽敞,发动机动力也非常强劲,其轴距一般均大于2.8m,排量基本都在3.0L以上,常见的D级车有奔驰S系列、宝马7系、奥迪A8和劳斯莱斯、宾利等几个品牌的车型。
车辆识别码
车辆识别码(Vehicle Identification Number,简称成VIN)有时也被称为车架号,按照SAE标准规定是一组由17个英文或数字组成,所以又称之为十七位码,可以识别汽车的生产商、发动机、底盘序号及其他性能等资料。为了避免与数字的1、0混淆,英文字母“I”、“O”、“Q”均不使用;VIN码一车一码,30年内不会重号。正确解读VIN码,对于我们正确地识别车型,进而正确进行诊断和维修都是十分重要的。
VIN码的编码规则
- 1~3位(WMI):世界制造商识别代码,表明车辆是由谁生产的。
- 4~8位(VDS):车辆特征代码。
- 第9位:校验位,通过一定的算法防止输入错误。
- 第10位:车型年份,即厂家规定的型年(Model Year),不一定是实际生产的年份,但一般与实际生产的年份之差不超过1年。
- 第11位:装配厂。
第12~17位:顺序号。一般情况下,汽车召回都是针对某一顺序号范围内的车辆,即某一批次的车辆。
VIN码所在位置
通常在下列位置会出现VIN码。
- 在汽车上,VIN码大多位于仪表板左侧、风挡玻璃下面、发动机室内的各种铭牌上或驾驶员侧车门柱上等显著位置。
- 在机动车行驶证上,“车架号”或“车辆型号”栏内一般都打印有VIN码。
在机动车辆保险单上,“车架号”栏内一般也打印有VIN码。
VIN码的真假验算方法
VIN码的校验计算方法见下表,数值之和除以11的余数就是第9位的数值
位数 | 加权 | 位数 | 加权 |
---|---|---|---|
1 | x8 | 10 | x9 |
2 | x7 | 11 | x8 |
3 | x6 | 12 | x7 |
4 | x5 | 13 | x6 |
5 | x4 | 14 | x5 |
6 | x3 | 15 | x4 |
7 | x2 | 16 | x3 |
8 | x10 | 17 | x2 |
年份的识别方法
VIN码的第10位表示车辆的生产年份,具体如下:
年份 | 代码 | 年份 | 代码 |
---|---|---|---|
1971 | 1 | 2001 | 1 |
1972 | 2 | 2002 | 2 |
1973 | 3 | 2003 | 3 |
1974 | 4 | 2004 | 4 |
1975 | 5 | 2005 | 5 |
1976 | 6 | 2006 | 6 |
1977 | 7 | 2007 | 7 |
1978 | 8 | 2008 | 8 |
1979 | 9 | 2009 | 9 |
1980 | A | 2010 | A |
1981 | B | 2011 | B |
1982 | C | 2012 | C |
1983 | D | 2013 | D |
1984 | E | 2014 | E |
1985 | F | 2015 | F |
1986 | G | 2016 | G |
1987 | H | 2017 | H |
1988 | J | 2018 | J |
1989 | K | 2019 | K |
1990 | L | 2020 | L |
1991 | M | 2021 | M |
1992 | N | 2022 | N |
1993 | P | 2023 | P |
1994 | R | 2024 | R |
1995 | S | 2025 | S |
1996 | T | 2026 | T |
1997 | V | 2027 | V |
1998 | W | 2028 | W |
1999 | X | 2029 | X |
2000 | Y | 2030 | Y |
使用此规则写一个校验VIN的代码如下:
public class VINUtil {
/**
* VIN码支持的字符
*/
private static final String CHARS = "0123456789ABCDEFGHJKLMNPRSTUVWXYZ";
private static final String CHARS_NUM = "012345678912345678123457923456789";
/**
* 字符表
*/
private static final Map<Character, Integer> CHAR_MAP = new HashMap<>(64);
/**
* 位置权重表
*/
private static final int[] POS_WEIGHTS = new int[] { 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 };
static {
Assert.isTrue(StringUtils.isNotBlank(CHARS));
Assert.isTrue(StringUtils.isNotBlank(CHARS_NUM));
Assert.isTrue(CHARS.length() == CHARS_NUM.length());
char[] charArray = CHARS.toCharArray();
char[] numArray = CHARS_NUM.toCharArray();
for (int i = 0; i < CHARS.length(); i++) {
CHAR_MAP.put(charArray[i], Character.getNumericValue(numArray[i]));
}
}
public static boolean isValidVIN(String vin) {
if (StringUtils.isBlank(vin) || vin.length() != 17)
return false;
vin = vin.toUpperCase();
int sum = 0;
int checkSum = -1; // 第9位校验位
for (int i = 0; i < vin.length(); i++) {
char code = vin.charAt(i);
Integer codeToNum = CHAR_MAP.get(code);
Assert.notNull(codeToNum, "code must not be null");
sum += codeToNum * POS_WEIGHTS[i];
if (i == 8) { // 获取校验位的值
checkSum = checkSum2Num(code);
}
}
return checkNumValid(sum, checkSum);
}
/**
* 第9位校验码转数字
*/
private static final int checkSum2Num(char ninthCheckSum) {
if (ninthCheckSum >= '0' && ninthCheckSum <= '9') {
return Character.getNumericValue(ninthCheckSum);
} else if (ninthCheckSum == 'X') {
return 10;
} else {
throw new IllegalArgumentException("第9位校验码不合法");
}
}
private static final boolean checkNumValid(int sum, int checkSum) {
return checkSum == sum % 11;
}
public static void main(String[] args) {
String vin = "LFV2A11G0A3022502";
boolean result = VINUtil.isValidVIN(vin);
System.out.println(result);
}
}
代码只是使用第9位校验位来校验VIN,比较粗糙,如果再补充WMI等信息校验会更完善,详细点可以做到通过VIN识别车辆的详细信息(如下图所示)。不过这种东西有现成的API可以买了接,而且使用场景不是很广泛,自己撸一个意义不大,还要维护信息。