zoukankan      html  css  js  c++  java
  • [技术栈]C#利用Luhn算法(模10算法)对IMEI校验

    1、Luhn算法(模10算法)

    通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图:

    Luhn算法
    算法主要分为三步:
    第一步:从右边第一位(最低位)开始隔位乘2;
    第二步:把第一步所得的每一个数字加入到原来的数中,比如9*2=18,为1+8
    第三步:用以0结尾且大于第二步所获得的数的和的最小整数减去第二步所获得的和即可以获得校验位,如70-67=3,3即为校验位,如果第二步所有数字的和以0结尾,比如30、40、50等,那么校验为0;

    2、IMEI校验

    IMEI码由GSM(Global System for Mobile Communications,全球移动通信协会)统一分配,授权BABT(British approvals Board of Telecommunications,英国通信认证管理委员会)审受。
    TS.06 IMEI Allocation and Approval Process中规定IMEI校验应该通过Luhn算法计算,如下图所示:
    IMEI Allocation and Approval
    3、C#代码

    public class LuhnCalcCheckDigit
    {
    
        /// <summary>
        /// 通过Luhn算法计算校验位,适合IMEI、银行卡等
        /// </summary>
        /// <param name="imei">不包含校验位的号码</param>
        /// <returns></returns>
        public static int CalcLuhnCheckDigit(string imei)
        {
            int checkDigit = 0;
            int addValue = 0;
            for (int i = 0; i < imei.Length; i++)
            {
                if (i % 2 == 0)
                {
                    int result = Convert.ToInt32(imei[imei.Length - i - 1].ToString()) * 2;
                    if (result > 9)
                    {
                        addValue += (result - 9);
                    }
                    else
                    {
                        addValue += result;
                    }
                }
                else
                {
                    addValue += Convert.ToInt32(imei[imei.Length - i - 1].ToString());
                }
            }
    
            if (addValue % 10 == 0)
            {
                checkDigit = 0;
            }
            else
            {
                checkDigit = 10 - addValue % 10;
            }
            return checkDigit;
        }
    
    
        /// <summary>
        /// 通过Luhn算法核验号码是否合法,适合IMEI、银行卡等
        /// </summary>
        /// <param name="imei">包含校验位的号码</param>
        /// <returns></returns>
        public static bool VerifyLuhn(string imei)
        {
            int checkDigit = 0;
            int addValue = 0;
            for (int i = 1; i < imei.Length; i++)
            {
                if (i % 2 == 1)
                {
                    int result = Convert.ToInt32(imei[imei.Length - i - 1].ToString()) * 2;
                    if (result > 9)
                    {
                        addValue += (result - 9);
                    }
                    else
                    {
                        addValue += result;
                    }
                }
                else
                {
                    addValue += Convert.ToInt32(imei[imei.Length - i - 1].ToString());
                }
            }
            if (addValue % 10 == 0)
            {
                checkDigit = 0;
            }
            else
            {
                checkDigit = 10 - addValue % 10;
            }
            return (checkDigit - Convert.ToInt32(imei[imei.Length - 1].ToString())) == 0;
        }
    
    }
    

    4、参考资料链接

    TS.06 IMEI Allocation and Approval Process
    ISO/IEC 7812-1:2017

  • 相关阅读:
    文件处理(记录经典代码及相关逻辑)
    python与pip在widow下cmd命令行操作问题收集:python、pip不是内部或外部命令,也不是可运行程序
    python—函数中存在的部分问题
    python —匿名函数(lambda)
    Python—递归函数
    python-函数参数
    python代码运行过程
    String类练习
    String类的常用方法
    死锁与进程通信
  • 原文地址:https://www.cnblogs.com/wulinn/p/11595896.html
Copyright © 2011-2022 走看看