当前位置 : 主页 > 编程语言 > java >

对imei进行校验,重点:imei第15位为校验位,可以通过前十四位判断第十五位是

来源:互联网 收集:自由互联 发布时间:2021-06-28
imei校验 package com.mimidai.imeicheck;import org.springframework.util.StringUtils;/** * Imei校验算法 由15位数字组成,前6位(TAC)是型号核准号码,代表手机类型。接着2位(FAC)是最后装配号,代表产地。 后
imei校验
package com.mimidai.imeicheck;

import org.springframework.util.StringUtils;

/**
 * Imei校验算法 由15位数字组成,前6位(TAC)是型号核准号码,代表手机类型。接着2位(FAC)是最后装配号,代表产地。 后6位(SNR)是串号,代表生产顺序号。最后1位(SP)是检验码。
 *
 * @author mengqingyi
 * @create 2017-11-07 11:32
 **/
public class ImeiCheckUtil {
    private final static int LENGTH = 7;
    private final static int IMEILENGTH = 15;
    // private final static String pattern = "[0-9]|(123456789[0,9]){14,}";

    /**
     * 格式化IMEI 统一IMEI长度为15位
     */
    public static Boolean formatImei(String imei) {
        return getImei(imei);
    }

    /**
     * eg: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
     */
    private static Boolean getImei(String imei) {
        //无效imei
        if (StringUtils.isEmpty(imei)) {
            return Boolean.FALSE;
        }
        //对imei中存在空值的部分直接判flase
        imei = imei.replace(" ", "");
        //非长度为15位的imei直接判pass
        if (imei.length() != IMEILENGTH) {
            return Boolean.FALSE;
        }
        //对于imei完全一样的直接判定 false
        if (imei.contains("000000")) {
            return Boolean.FALSE;
        }
        String checkBit = imei.substring(14, 15);
        //如果imei位数为15,取前14位,对比最后一位
        if (imei.length() == IMEILENGTH) {
            imei = imei.substring(0, 14);
        }
        char[] imeiChar = imei.toCharArray();
        int resultNum = 0;
        for (int i = 0; i < LENGTH; i++) {
            //偶数
            int even = Integer.parseInt(String.valueOf(imeiChar[i * 2 + 1])) * 2;
            //奇数
            int odd = Integer.parseInt(String.valueOf(imeiChar[i * 2]));
            char[] evenChar = (even + "").toCharArray();
            int evenNum = evenChar.length < 2 ? evenChar.length : 2;
            int evenResult = 0;
            for (int j = 0; j < evenNum; j++) {
                evenResult += Integer.parseInt(String.valueOf(evenChar[j]));
            }
            resultNum += (evenResult + odd);
        }
        resultNum %= 10;
        resultNum = resultNum == 0 ? 0 : (10 - resultNum);
        if (Integer.parseInt(checkBit) == resultNum) {
            return Boolean.TRUE;
        } else {
            return Boolean.FALSE;
        }
    }

    public static void main(String[] args) {
        System.out.println(getImei("123456789123456"));
        System.out.println(getImei("000000000000000"));
        System.out.println(getImei("111111111111111"));
        System.out.println(getImei("222222222222222"));
        System.out.println(getImei("333333333333333"));
        System.out.println(getImei("444444444444444"));
        System.out.println(getImei("555555555555555"));
        System.out.println(getImei("666666666666666"));
        System.out.println(getImei("777777777777777"));
        System.out.println(getImei("888888888888888"));
        System.out.println(getImei("999999999999999"));
        System.out.println(getImei("101010101010100"));

        System.out.println(getImei("A10000492415EF"));
    }
}
网友评论