美文网首页
VIN 车架号 模11校验

VIN 车架号 模11校验

作者: 戈壁堂 | 来源:发表于2020-08-08 11:23 被阅读0次

    Vehicle identification number

    • 1 ~ 3 位为世界制造商标识码(简称“WMI”)
    • 4 ~ 9 位为车辆说明部分(简称“VDS”)
    • 10 ~ 17位为车辆指示码(简称“VIS”)

    第9位为校验码,只能是数字0-9或X(罗马数字10),

    • 其他16位字码对应数值乘以其所位置权重数
    • 上一步中的每一个位置的和除以11得到余数
    • 当余数为0-9时候,余数就是检验数字;当余数为10时,X为检验代码

    每个字母代表的值(数字则为数字本身的值)——


    每个位置的权重数——例如,第一位权重为8,第17位权重为2。第9位是校验位,所以权重为0。0乘任何数还是0。

    假设VIN号码为1M8GDM9A_KP042788 (第9位为校验位,忽略),那么检查规则为——

    • 第一行为VIN的号码
    • 第二行为每个VIN号码的(数字)值
    • 第三行为每个位置的权重值
    • 第四行我每个位置最终的计算值

    最终将第四行都加起来结果为351, 除以11,余数为10。根据规则,校验码为X

    所以最终的VIN号码为1M8GDM9AXKP042788

    func checkVinDigit(vin string) string {
        transKeys := map[string]int{"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "J": 1, "K": 2, "L": 3, "M": 4, "N": 5, "P": 7, "R": 9, "S": 2, "T": 3, "U": 4, "V": 5, "W": 6, "X": 7, "Y": 8, "Z": 9}
    
        positionWeight := map[int]int{1: 8, 2: 7, 3: 6, 4: 5, 5: 4, 6: 3, 7: 2, 8: 10, 9: 0, 10: 9, 11: 8, 12: 7, 13: 6, 14: 5, 15: 4, 16: 3, 17: 2}
    
        var sum int
        for i, c := range vin {
            var s = string(c)
            if i != 8 {
                var val int
                if v, value := transKeys[s]; value {
                    val = v
                } else {
                    in, _ := strconv.Atoi(s)
                    val = in
                }
                sum += val * positionWeight[i+1]
            }
        }
    
        r := sum % 11
    
        if r == 10 {
            return "X"
        }
        return strconv.Itoa(r)
    }
    

    相关文章

      网友评论

          本文标题:VIN 车架号 模11校验

          本文链接:https://www.haomeiwen.com/subject/jhetdktx.html