[技术栈]C#利用Luhn算法(模10算法)对IMEI校验

一、Luhn算法(模10算法)

经过查看ISO/IEC 7812-1:2017文件能够看到对于luhn算法的解释,以下图:git

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

二、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 三、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;
    }

}

四、参考资料连接

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

相关文章
相关标签/搜索