程序实现IMEI/MEID校验位计算

IMEI校验码算法:
(1).将偶数位数字分别乘以2,分别计算个位数和十位数之和
(2).将奇数位数字相加,再加上上一步算得的值
(3).如果得出的数个位是0则校验位为0,否则为10减去个位数
如:35 89 01 80 69 72 41 偶数位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 => 校验位 10-3 = 7

MEID校验码算法:
(1).将偶数位数字分别乘以2,分别计算个位数和十位数之和,注意是16进制数
(2).将奇数位数字相加,再加上上一步算得的值
(3).如果得出的数个位是0则校验位为0,否则为10(这里的10是16进制)减去个位数
如:AF 01 23 45 0A BC DE 偶数位乘以2得到F*2=1E 1*2=02 3*2=06 5*2=0A A*2=14 C*2=18 E*2=1C,计算奇数位数字之和和偶数位个位十位之和,得到 A+(1+E)+0+2+2+6+4+A+0+(1+4)+B+(1+8)+D+(1+C)=64 => 校验位 10-4 = C
 

/**
 * IMEI是国际移动通讯设备识别号(International Mobile Equipment Identity)的缩写,用于GSM系统。
 * 由15位数字组成,前6位(TAC)是型号核准号码,代表手机类型。接着2位(FAC)是最后装配号,代表产地。后6位(SNR)是串号,代表生产顺序号。最后1位(SP)是检验码。
 * MEID是移动通讯设备识别号(Mobile Equipment IDentifier)的缩写,用于CDMA系统。
 * 由15位16进制数字组成,前8位是生产商编号,后6位是串号,最后1位是检验码。
 * @author fengyifei11228
 * @since 2015-05-22
 */
public class DeviceUtil {
    /**
     * 格式化MEID
     * 因为MEID格式不统一,长度有14位和16位的,所以,为了统一,将14位和16位的MEID,统一设置为15位的 设置格式:
     * 如果MEID长度为14位,那么直接得到第15位,如果MEID长度为16位,那么直接在根据后14位得到第15位
     * 如果MEID长度为其他长度,那么直接返回原值
     * @param meid
     * @return
     */
    public static String formatMeid(String meid) {
        int dxml = meid.length();
        if (dxml != 14 && dxml != 16) {
            return meid;
        }
        String meidRes = "";
        if (dxml == 14) {
            meidRes =  meid + getmeid15(meid);
        }
        if (dxml == 16) {
            meidRes = meid.substring(2) + getmeid15(meid.substring(2));
        }
        return meidRes;
    }
 
    /**
     * 格式化IMEI
     * 因为IMEI格式不统一,长度有14位和16位的,所以,为了统一,将14位和16位的MEID,统一设置为15位的 设置格式:
     * 如果IMEI长度为14位,那么直接得到第15位,如果MEID长度为16位,那么直接在根据前14位得到第15位
     * 如果IMEI长度为其他长度,那么直接返回原值
     * @param imei
     * @return

     */
    public static String formatImei(String imei) {
        int dxml = imei.length();
        if (dxml != 14 && dxml != 16) {
            return imei;
        }
        String imeiRes = "";
        if (dxml == 14) {
            imeiRes =  imei + getimei15(imei);
        }
        if (dxml == 16) {
            imeiRes =  imei + getimei15(imei.substring(0,14));
        }
        return imeiRes;
    }
    /**
     * 根据MEID的前14位,得到第15位的校验位
     * MEID校验码算法:
     * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和,注意是16进制数
     * (2).将奇数位数字相加,再加上上一步算得的值
     * (3).如果得出的数个位是0则校验位为0,否则为10(这里的10是16进制)减去个位数
     * 如:AF 01 23 45 0A BC DE 偶数位乘以2得到F*2=1E 1*2=02 3*2=06 5*2=0A A*2=14 C*2=18 E*2=1C,
     *     计算奇数位数字之和和偶数位个位十位之和,得到 A+(1+E)+0+2+2+6+4+A+0+(1+4)+B+(1+8)+D+(1+C)=64
     *  校验位 10-4 = C
     * @param meid
     * @return

     */

JAVA:
    private static String getmeid15(String meid) {
        if (meid.length() == 14) {
            String myStr[] = { "a", "b", "c", "d", "e", "f" };
            int sum = 0;
            for (int i = 0; i < meid.length(); i++) {
                String param = meid.substring(i, i + 1);
                for (int j = 0; j < myStr.length; j++) {
                    if (param.equalsIgnoreCase(myStr[j])) {
                        param = "1" + String.valueOf(j);
                    }
                }
                if (i % 2 == 0) {
                    sum = sum + Integer.parseInt(param);
                } else {
                    sum = sum + 2 * Integer.parseInt(param) % 16;
                    sum = sum + 2 * Integer.parseInt(param) / 16;
                }
            }
            if (sum % 16 == 0) {
                return "0";
            } else {
                int result = 16 - sum % 16;
                if (result > 9) {
                    result += 65 - 10;
                }
                return result + "";
            }
        } else {
            return "";
        }
    }

C#:

public String getmeid15(String meid)
        {
            if (meid.Length == 14)
            {
                string str = "";
                string[] myStr = { "A", "B", "C", "D", "E", "F" };
                int sum = 0;
                for (int i = 0; i < meid.Length; i++)
                {
                    string param = meid.Substring(i, 1);
                    for (int j = 0; j < myStr.Length; j++)
                    {
                        if (param == myStr[j])
                        {
                            param = "1" + j.ToString();
                        }
                    }

                    if (i % 2 == 0)
                    {
                        sum = sum + int.Parse(param);
                    }
                    else
                    {
                        sum = sum + 2 * int.Parse(param) % 16;
                        sum = sum + 2 * int.Parse(param) / 16;
                    }
                }

                if (sum % 16 == 0) {
                    return "0";
                }
                else
                {
                    int result = 16 - sum % 16;
                    if (result > 9)
                    {
                        result += 65 - 10;
                    }
                    return result + "" ;
                }
            }
            else
            {
                return "";
            }
        }

    /**
     * 根据IMEI的前14位,得到第15位的校验位
     * IMEI校验码算法:
     * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和
     * (2).将奇数位数字相加,再加上上一步算得的值
     * (3).如果得出的数个位是0则校验位为0,否则为10减去个位数
     * 如:35 89 01 80 69 72 41 偶数位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和,
     * 得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63
      * 校验位 10-3 = 7
     * @param imei
     * @return

     */
    private static String getimei15(String imei){
        if (imei.length() == 14) {
            char[] imeiChar=imei.toCharArray();  
            int resultInt=0;  
            for (int i = 0; i < imeiChar.length; i++) {  
                int a=Integer.parseInt(String.valueOf(imeiChar[i]));  
                i++;  
                final int temp=Integer.parseInt(String.valueOf(imeiChar[i]))*2;  
                final int b=temp<10?temp:temp-9;  
                resultInt+=a+b;  
            }  
            resultInt%=10;  
            resultInt=resultInt==0?0:10-resultInt;  
            return resultInt + "";
        }else{
            return "";
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值