C# 校验车架号(VIN码)第9位是否有效算法

     public static bool checkVIN(string vin)
        {
            //VIN码从第1位到第17位的“加权值”:
            Dictionary<int, int> vinMapWeighting = new Dictionary<int, int>();
            vinMapWeighting.Add(1, 8);
            vinMapWeighting.Add(2, 7);
            vinMapWeighting.Add(3, 6);
            vinMapWeighting.Add(4, 5);
            vinMapWeighting.Add(5, 4);
            vinMapWeighting.Add(6, 3);
            vinMapWeighting.Add(7, 2);
            vinMapWeighting.Add(8, 10);
            vinMapWeighting.Add(9, 0);
            vinMapWeighting.Add(10, 9);
            vinMapWeighting.Add(11, 8);
            vinMapWeighting.Add(12, 7);
            vinMapWeighting.Add(13, 6);
            vinMapWeighting.Add(14, 5);
            vinMapWeighting.Add(15, 4);
            vinMapWeighting.Add(16, 3);
            vinMapWeighting.Add(17, 2);
            //VIN码各位数字的“对应值”
            Dictionary<string, int> vinMapValue = new Dictionary<string, int>();
            vinMapValue.Add("0", 0);
            vinMapValue.Add("1", 1);
            vinMapValue.Add("2", 2);
            vinMapValue.Add("3", 3);
            vinMapValue.Add("4", 4);
            vinMapValue.Add("5", 5);
            vinMapValue.Add("6", 6);
            vinMapValue.Add("7", 7);
            vinMapValue.Add("8", 8);
            vinMapValue.Add("9", 9);
            vinMapValue.Add("A", 1);
            vinMapValue.Add("B", 2);
            vinMapValue.Add("C", 3);
            vinMapValue.Add("D", 4);
            vinMapValue.Add("E", 5);
            vinMapValue.Add("F", 6);
            vinMapValue.Add("G", 7);
            vinMapValue.Add("H", 8);
            vinMapValue.Add("J", 1);
            vinMapValue.Add("K", 2);
            vinMapValue.Add("M", 4);
            vinMapValue.Add("L", 3);
            vinMapValue.Add("N", 5);
            vinMapValue.Add("P", 7);
            vinMapValue.Add("R", 9);
            vinMapValue.Add("S", 2);
            vinMapValue.Add("T", 3);
            vinMapValue.Add("U", 4);
            vinMapValue.Add("V", 5);
            vinMapValue.Add("W", 6);
            vinMapValue.Add("X", 7);
            vinMapValue.Add("Y", 8);
            vinMapValue.Add("Z", 9);
            bool reultFlag = false;
            string uppervin = vin.ToLower();
            //排除字母O、I
            if (vin == null || uppervin.IndexOf("O") >= 0 || uppervin.IndexOf("I") >= 0)
            {
                reultFlag = false;
            }
            else
            {
                //1:长度为17
                if (vin.Length == 17)
                {
                    int len = uppervin.Length;
                    string[] vinArr = new string[len];
                    for (int i = 0; i < len; i++)
                    {
                        vinArr[i] = uppervin.Substring(i, 1);
                    }
                    int amount = 0;
                    for (int i = 0; i < vinArr.Length; i++)
                    {
                        //VIN码从从第一位开始,码数字的对应值×该位的加权值,计算全部17位的乘积值相加
                        if (vinMapValue.ContainsKey(vinArr[i].ToUpper()))
                            amount += vinMapValue[vinArr[i].ToUpper()] * vinMapWeighting[i + 1];
                    }
                    //乘积值相加除以11、若余数为10,即为字母X
                    if (amount % 11 == 10)
                    {
                        if (vinArr[8].ToUpper() == "X")
                        {
                            reultFlag = true;
                        }
                        else
                        {
                            reultFlag = false;
                        }
                    }
                    else
                    {
                        //VIN码从从第一位开始,码数字的对应值×该位的加权值,计算全部17位的乘积值相加除以11,所得的余数,即为第九位校验值
                        if (vinMapValue.ContainsKey(vinArr[8].ToUpper()))
                        {
                            if (amount % 11 != vinMapValue[vinArr[8].ToUpper()])
                            {
                                reultFlag = false;
                            }
                            else
                            {
                                reultFlag = true;
                            }
                        }
                    }
                }
                //1:长度不为17
                if (!vin.Equals("") && vin.Length != 17)
                {
                    reultFlag = false;
                }
            }
            return reultFlag;
        }

 

posted @ 2019-06-28 10:55  CHNMurphy  阅读(1283)  评论(0编辑  收藏  举报