imei校验 package com.mimidai.imeicheck;import org.springframework.util.StringUtils;/** * Imei校验算法 由15位数字组成,前6位(TAC)是型号核准号码,代表手机类型。接着2位(FAC)是最后装配号,代表产地。 后
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")); } }