我们都知道在android 中有IMEI和ICCID 这两项数据. 至于这两项数据的获取方式以及所表示的意思在此我就不写了.主要讲讲这两项数据最后一位的校验位如何计算的.
IMEI共15位 最后一位是校验位. 其校验位计算规则如下:
1. 从左到右将偶数位数字分别乘以2,然后计算个位数和十位数之和
2. 将奇数位数字相加,再加上上一步算得的值
3. 如果得出的数个位是0则校验位为0,否则为10减去个位数
例: 864682038025912 最后一位校验位是 2 所以我们拿出前14位来计算
8 | 6 | 4 | 6 | 8 | 2 | 0 | 3 | 8 | 0 | 2 | 5 | 9 | 1 |
12 | 12 | 4 | 6 | 0 | 10 | 2 | |||||||
8 | 1+2 | 4 | 1+2 | 8 | 4 | 0 | 6 | 8 | 0 | 2 | 1+0 | 9 | 2 |
第三行相加 得到 8+1+2+4+1+2+8+4+0+6+8+0+2+1+9+2 = 58
OK, 我们得到的值是58 显然个位数字不是0 所以校验位的值应该是 10-8 = 2 最后校验位就是 2
现在Java代码如下:
/**
* 根据IMEI的前14位 计算出第15位
* @param imei 的前14位
* @return
*/
public 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";
}
}
ICCID共20位, 最后一位的校验位计算规则如下:
1. 取前19位 . 从左到右奇数位开始. 乘以2 然后计算个位与十位数之和.
2. 将所有偶数位的数字与上一步得到的值全部相加
3. 将上一步得到的值乘以9 然后取余. 得到的值就是第20位的校验位
例: 89860262191507034404 最后一位校验位是4
8 | 9 | 8 | 6 | 0 | 2 | 6 | 2 | 1 | 9 | 1 | 5 | 0 | 7 | 0 | 3 | 4 | 4 | 0 |
16 | 16 | 0 | 12 | 2 | 2 | 0 | 0 | 8 | 0 | |||||||||
1+6 | 9 | 1+6 | 6 | 0 | 2 | 1+2 | 2 | 2 | 9 | 2 | 5 | 0 | 7 | 0 | 3 | 8 | 4 | 0 |
第三行相加 1+6+9+1+6+6+0+2+1+2+2+2+9+2+5+0+7+0+3+8+4+0=76
76*9 = 684
校验位就是 684%10=4 各位可以到 http://www.heicard.com/check_iccid 验证该计算方法.
java代码如下
/**
* 获取ICCID的第20位
* @param iccid iccid的前19位
* @return
*/
public static String getICCID20(String iccid){
if (iccid.length() == 19) {
char[] imeiChar=iccid.toCharArray();
int resultInt = 0;
for (int i = 0; i < imeiChar.length; i++) {
int a=Integer.parseInt(String.valueOf(imeiChar[i]))*2;
int count = a/10+a%10; //将十位数 与个位数 相加
resultInt = resultInt+ count;
i++;
if(i<19) {
int b=Integer.parseInt(String.valueOf(imeiChar[i]));
resultInt = resultInt + b;
}
}
resultInt = resultInt*9;
return String.valueOf(resultInt%10);
}else{
return "6";
}
}