android中 IMEI和ICCID的校驗位計算
我們都知道在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";
}
}