组成
IMEI = TAC + FAC + SNR + CD
IMEI = International Mobile station Equipment Identity 国际移动设备识别码 6位
TAC = Type Approval Code 类型批准码 2位
FAC = Final Assembly Code 最终装配码 2位
SNR = Serial Number 序列号 6位
CD = Check Digit 校验数字 1位
IMEISV = TAC + FAC + SNR + CD + SVN
IMEISV = International Mobile station Equipment Identity and Software Version Number
TAC = Type Approval Code
FAC = Final Assembly Code
SNR = Serial Number
CD = Check Digit
SVN = Software Version Number 2位
一段VB代码,有时间的话,转成C
Private Function IMEICRC()
Dim i As Integer
Dim flag As Integer
Dim checksum As Integer
‘Hehe im not writing a tutorial in vb source comments,
‘read the .txt with this for imei algo…For i = 1 To 14 ‘Loop for IMEI checksum calculation algorithm
If Mid(IMEI, i, 1) = 0 Then
If flag = 0 Then
flag = 1
Else
flag = 0
End If
End If
If Mid(IMEI, i, 1) = 1 Then
If flag = 0 Then
checksum = checksum + 9
flag = 1
Else
checksum = checksum + 8
flag = 0
End If
End If
If Mid(IMEI, i, 1) = 2 Then
If flag = 0 Then
checksum = checksum + 8
flag = 1
Else
checksum = checksum + 6
flag = 0
End If
End If
If Mid(IMEI, i, 1) = 3 Then
If flag = 0 Then
checksum = checksum + 7
flag = 1
Else
checksum = checksum + 4
flag = 0
End If
End IfIf Mid(IMEI, i, 1) = 4 Then
If flag = 0 Then
checksum = checksum + 6
flag = 1
Else
checksum = checksum + 2
flag = 0
End If
End IfIf Mid(IMEI, i, 1) = 5 Then
If flag = 0 Then
checksum = checksum + 5
flag = 1
Else
checksum = checksum + 9
flag = 0
End If
End IfIf Mid(IMEI, i, 1) = 6 Then
If flag = 0 Then
checksum = checksum + 4
flag = 1
Else
checksum = checksum + 7
flag = 0
End If
End IfIf Mid(IMEI, i, 1) = 7 Then
If flag = 0 Then
checksum = checksum + 3
flag = 1
Else
checksum = checksum + 5
flag = 0
End If
End IfIf Mid(IMEI, i, 1) = 8 Then
If flag = 0 Then
checksum = checksum + 2
flag = 1
Else
checksum = checksum + 3
flag = 0
End If
End IfIf Mid(IMEI, i, 1) = 9 Then
If flag = 0 Then
checksum = checksum + 1
flag = 1
Else
checksum = checksum + 1
flag = 0
End If
End IfNext i ‘loop while i is not 14
Do While checksum >= 10 ‘ because we _disibledevent= checksum – 10
Loop
If checksum = Int(Mid(IMEI, 15, 1)) Then
IMEICRC = True
Else
IMEICRC = False
End If
end function
改成了C版本,一个是用公式,一个是查表, 都没有做严格的数据检查
int check(char *imei)
{
int i , c;
int checksum = 0;
for (i=0; i<14; i++) {
c = imei[i]-0×30;
if (i%2 == 0) {
checksum += (10-c);
} else {
if (c<=4) {
checksum += (10-2*c);
} else {
checksum += 19-2*c;
}
}
checksum %= 10;
}
return checksum;
}
下面是查表的版本
int even[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
int odd[10] = {10, 8, 6, 4, 2, 9, 7, 5, 3, 1};
int check2(char *imei)
{
int i,c;
int checksum = 0;
for (i=0; i<14; i++) {
c = imei[i] – ‘0′;
if (0 == i%2) {
checksum += even[c];
} else {
checksum += odd[c];
}
checksum %= 10;
}
return checksum;
}
还是C实现起来,简洁明了一些
出处:http://zhiwei.li/text/2009/07/imei%e5%92%8cimeisv/