俄罗斯某个大神给出的算法
//mtk imei 加密算法,官方未公布,不同平台或许不一样需要验证。
int calc_imei(char* inp_imei, char* out_imei)
{
char out_mask[12] = {0xAB, 0xA0, 0x6F, 0x2F, 0x1F, 0x1E, 0x9A, 0xB5, 0x0, 0x0, 0x0, 0x0};
int i=0, j=0;
if(inp_imei == 0)
return 1;
if(strlen(inp_imei) < 15)
return 1;
for (i=0, j=0; i < 15; i++, j++)
{
if (inp_imei[i] < '0' || inp_imei[i] > '9')
{
return 1;
}
out_imei[j] = (inp_imei[i] - '0');
if (i >= 14)
break;
if (inp_imei[i+1] < '0' || inp_imei[i+1] > '9')
{
return 1;
}
out_imei[j] += ((inp_imei[i+1] - '0') << 4);
out_imei[j] = out_imei[j] ^ out_mask[j];
i++;
}
out_imei[j] = out_imei[j] ^ out_mask[j];
out_imei[8] = 0xD2;//0x55; //Может быть и 0x0, ни на что не влияет
out_imei[9] = 0x8A;//0x8B; //Может быть и 0x0, ни на что не влияет
out_imei[10] = out_imei[11] = 0;
for (i = 0; i < 10; i++)
{
if (i & 0x1)
{
out_imei[11] += out_imei[i];
}
else
{
out_imei[10] += out_imei[i];
}
}
return 0;
}
IMEI校验位算法
//最后一位校验位计算
char GetIMEICheckDigit(char *imei)
{
int i;
int sum1=0,sum2=0,total=0;
int temp=0;
for( i=0; i<14; i++ )
{
if((i%2)==0)
{
sum1 = sum1 + imei[i] - '0';
}
else
{
temp = (imei[i]-'0')*2;
if( temp < 10 )
{
sum2 = sum2 + temp;
}
else
{
sum2 = sum2 + 1 + temp - 10;
}
}
}
total = sum1 + sum2;
if( (total%10) == 0 )
{
return '0';
}
else
{
return (char)(((total/10) * 10) + 10 - total+'0');
}
}