汽车分类及VIN码

前几天下班路上随手看看有什么书好看, 看到一本汽车的书想起来自己对车什么都不懂, 虽然驾照都拿了6年了, 还是对车没什么情绪, 就翻了翻,了解下常识。
1-150P6101031534.jpg

汽车分类原则

在我国,轿车按照发动机排量划分为:微型轿车(排量在1L以下)、普通轿车(排量为1.0~1.6L)、中级轿车(排量为1.6~2.5L)、中高级轿车(排量为2.5~4.0L)、高级轿车(排量在4L以上)。

  1. 汽车的分类标准
    我国汽车主要分为载货汽车、越野汽车、自卸汽车、牵引车、专用汽车、客车、轿车、半挂车等几种类型。

    1. 载货汽车主要有微型货车、轻型货车、中型货车、重型货车。
    2. 越野汽车主要有轻型越野车、中型越野车、重型越野车、超重型越野车。
    3. 自卸汽车主要有轻型自卸车、中型自卸车、重型自卸车、矿用自卸车。
    4. 牵引车主要有半挂牵引车、全挂牵引车。
    5. 专用汽车主要有厢式汽车、罐式汽车、起重举升车、仓栅式车、特种结构车、专用自卸车。
    6. 客车主要有微型客车、轻型客车、中型客车、大型客车、特大型客车。
    7. 轿车主要有微型轿车、普通轿车、中级轿车、中高级轿车、高级轿车。
    8. 半挂车主要有轻型半挂车、中型半挂车、重型半挂车、超重型半挂车。
  2. 欧系分类
    德国大众是欧洲最大的汽车制造商,也是最早进入中国轿车市场的企业,它的轿车分类法具有代表性。德国轿车分为A、B、C、D级。

    1. A级车又可分为A00、A0级车,相当于我国微型轿车和普通轿车。
    2. B级车和C级车分别相当于我国的中级轿车和中高级轿车。
    3. D级车相当于我国红旗等高档轿车。该级别车的轴距越长,排量和重量越大,轿车的豪华程度也越高。

    车尾的字母有G、GL、GLS等,通常G表示基本型,GL表示豪华型,GLS表示顶级车。

  3. 美系分类
    对美系分类标准,通用公司一般将轿车分为6级,这是综合考虑了车型尺寸、排量、装备和售价之后得出的分类。其中,Mini相当于我国的微型轿车;我国的普通轿车在通用公司分类中可找到2个级别,即Small和LowMed;中级轿车即Interm(B级);中高级轿车即UppMed;高级轿车对应的是Large/Lux级别。
  4. 功能划分
    按照功能性划分为房车、旅行轿车、轿跑车、跑车、敞篷车等车型。按照车型布置划分为四门五座、五门掀背、双门双座、双门五座软顶等。

    1. A00级轿车的轴距为2~2.2m,发动机排量小于1L,如奥拓就属于A00级轿车。
    2. A0级轿车的轴距为2.3~2.45m,排量为1~1.3L,比较典型的是两厢夏利轿车。
    3. A级车轴距范围为2.45~2.65m,排量在1.3~1.6L,一汽大众的捷达、上海大众的POLO都属于A级车。
    4. B级轿车轴距为2.6~2.75m,排量为1.6~2.4L。B级车市场逐渐成为国内汽车企业拼杀的主战场,如奥迪A4、帕萨特、中华、东方之子等众多车型均属于B级车阵营。
    5. C级轿车的轴距为2.7~2.8m,发动机排量为2.3~3.0L,国内名气最大的C级车非奥迪A6莫属。
    6. 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. 1~3位(WMI):世界制造商识别代码,表明车辆是由谁生产的。
  2. 4~8位(VDS):车辆特征代码。
  3. 第9位:校验位,通过一定的算法防止输入错误。
  4. 第10位:车型年份,即厂家规定的型年(Model Year),不一定是实际生产的年份,但一般与实际生产的年份之差不超过1年。
  5. 第11位:装配厂。
  6. 第12~17位:顺序号。一般情况下,汽车召回都是针对某一顺序号范围内的车辆,即某一批次的车辆。

    VIN码所在位置

    通常在下列位置会出现VIN码。

  7. 在汽车上,VIN码大多位于仪表板左侧、风挡玻璃下面、发动机室内的各种铭牌上或驾驶员侧车门柱上等显著位置。
  8. 在机动车行驶证上,“车架号”或“车辆型号”栏内一般都打印有VIN码。
  9. 在机动车辆保险单上,“车架号”栏内一般也打印有VIN码。

    VIN码的真假验算方法

    Snipaste_2021-08-22_23-46-04.jpg

VIN码的校验计算方法见下表,数值之和除以11的余数就是第9位的数值

位数加权位数加权
1x810x9
2x711x8
3x612x7
4x513x6
5x414x5
6x315x4
7x216x3
8x1017x2

年份的识别方法

VIN码的第10位表示车辆的生产年份,具体如下:

年份代码年份代码
1971120011
1972220022
1973320033
1974420044
1975520055
1976620066
1977720077
1978820088
1979920099
1980A2010A
1981B2011B
1982C2012C
1983D2013D
1984E2014E
1985F2015F
1986G2016G
1987H2017H
1988J2018J
1989K2019K
1990L2020L
1991M2021M
1992N2022N
1993P2023P
1994R2024R
1995S2025S
1996T2026T
1997V2027V
1998W2028W
1999X2029X
2000Y2030Y

使用此规则写一个校验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可以买了接,而且使用场景不是很广泛,自己撸一个意义不大,还要维护信息。
Snipaste_2021-08-24_00-55-26.jpg

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……