最近应客户要求做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_AutoChangeIMEI
Description :传入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;
}