最近應客戶要求做IMEI修改功能,於是認真的學習了IMEI的編排規則,以及如何算出IMEI:
1、什麼是IMEI?
IMEI為TAC + FAC + SNR + SP。IMEI(International Mobile Equipment Identity)是國際行動裝置身份碼的縮寫,國際移動裝備辨識碼,是由15位元字組成的"電子串號",它與每台手機一一對應,而且該碼是全世界唯一的。每一隻手機在組裝完成後都將被賦予一個全球唯一的一組號碼,這個號碼從生產到交付使用都將被製造生產的廠商所記錄。
其組成為:
1、前6位元(TAC)是"型號核准號碼",一般代表機型。
2、接著的2位元(FAC)是"最後裝配號",一般代表產地。
3、之後的6位元(SNR)是"串號",一般代表生產順序號。
4、最後1位元(SP)通常是"0",為檢驗碼,目前暫備用。
IMEI碼貼在手機背面的標誌上,並且讀寫於手機記憶體中。它也是該手機在廠家的"檔案"和"社會安全號碼"。
------TAC------------ --FAC- ------SNR-----------
D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
3 5 3 1 1 4 0 0 8 0 9 6 3 6 6
計算IMEI驗證碼的步驟:
1、把IMEI的奇數位元*2,如:D1,D3,D5,……D13
D13 D11 D9 D7 D5 D3 D1
10 2 8 0 0 12 12
2、將計算得到的7個奇數位元字分別以個位元相加(如果得到的是個兩位元,則十位和個位分別當成個位元來相加),再加上7個偶數位元字,如:D2,D4,D6……D14
3+1+0+3+2+1+8+0+0+8+0+9+1+2+3+1+2=44
3、如果第2步計算得到的數字末位為0,則驗證碼數字為0。如果第2步計算結果末位元不是0,則以大於第2步計算結果的以0結尾的雙位整數減去第2步的計算結果,所獲得的個位元即為驗證碼。
D0 = 50 -44 =6
2、下面附上自己寫的luhn演算法
/***********************************************************************************Function Name :CGIBASE_AutoChangeIMEIDescription :傳入14位IMEI值,計算出第15位校正碼,並返回15位IMEI值Author:zhou Ying***********************************************************************************/unsigned long CGIBASE_AutoChangeIMEI(char *pcSource, char *pcDest){ int i,j,k; int iTotal,iEvenTotal,iAddTotal,iTemp,iAuth; char acEven[10],acAdd[10], acTemp[3],acAuth[2]; if ( ( NULL == pcSource ) || ( NULL == pcDest ) ) { return 1; } memset(acEven, 0x0, sizeof(acEven)); memset(acAdd, 0x0, sizeof(acAdd)); j=0; k=0; iTemp=0; iEvenTotal=0; iAddTotal=0; iTotal=0; iAuth=0; for(i=0; i<14; i++) { if( 0 == (i%2) ) { acEven[j]=*(pcSource+i); memset(acTemp, 0x0, sizeof(acTemp)); sprintf(acTemp, "%c", acEven[j]); iTemp = atoi(acTemp); iEvenTotal += iTemp; j += 1; } else { acAdd[k]=*(pcSource+i); memset(acTemp, 0x0, sizeof(acTemp)); sprintf(acTemp, "%c", acAdd[k]); iTemp = atoi(acTemp) * 2; iAddTotal += (iTemp / 10) + (iTemp % 10); k += 1; } } iTotal = iEvenTotal + iAddTotal; if( iTotal >= 100 ) { iAuth = iTotal % 100 %10; if( iAuth != 0 ) { iAuth = ((iTotal % 100) / 10 + 1)*10 - iTotal % 100; } } else { iAuth = iTotal % 10; if( iAuth != 0 ) { iAuth = (iTotal / 10 + 1)*10 - iTotal; } } memset(acAuth, 0x0, sizeof(acAuth)); sprintf(acAuth, "%d", iAuth); strcat(pcDest, pcSource); strcat(pcDest, acAuth); return 0;}