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"));
}
}
