最后一位校验码校验方法:
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 9 16 6 0 2 12 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
第三行相加 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 验证该计算方法.
获取iccid代码:
//EFM32
char aH,aL;
int test2 = 0;
for(int j=0;j<30;j++){
if(xx[j]>='0'&&xx[j]<='9'&&test2 == 0)
{
aH = toupper(xx[j]);
aL = toupper(xx[++j]);
if (aH > 0x39)
aH -= 0x37;
else
aH -= 0x30;
if (aL > 0x39)
aL -= 0x37;
else
aL -= 0x30;
USART0_TX_Buffer[test2] = (aH<<4)|aL;
test2++;
}
else if (test2 != 0)
{
aH = toupper(xx[j]);
aL = toupper(xx[++j]);
if (aH > 0x39)
aH -= 0x37;
else
aH -= 0x30;
if (aL > 0x39)
aL -= 0x37;
else
aL -= 0x30;
USART0_TX_Buffer[test2] = (aH<<4)|aL;
test2++;
}
if(test2 == 10){break;} //10字节(iccid)
}
//STM32
//查询卡号
for (i = 0; i < 10;i++ ) {
char aH,aL;
int test2 = 0;
uint8_t j = 0;
BC26_CLEAR_RECEIVE;
// BC26_USART_SEND("AT+CIMI\r\n",strlen("AT+CIMI\r\n"));//
BC26_USART_SEND("AT+QCCID\r\n",strlen("AT+QCCID\r\n"));//
int delay=5;
while(delay--)
{
BC26_DELAY_MS(100);
if(strstr((char *)BC26_UART2_RX_BUF,"OK"))
{break;}
}
if( strstr((char *)BC26_UART2_RX_BUF,"OK")){
test2 = 0;
for(j=0;j<strlen((char *)BC26_UART2_RX_BUF);j++)
{
if(BC26_UART2_RX_BUF[j]>='0'&&BC26_UART2_RX_BUF[j]<='9'&&test2 == 0)
{
aH = toupper(BC26_UART2_RX_BUF[j]);
aL = toupper(BC26_UART2_RX_BUF[++j]);
if (aH > 0x39)
aH -= 0x37;
else
aH -= 0x30;
if (aL > 0x39)
aL -= 0x37;
else
aL -= 0x30;
m26DATA[35+test2]= (aH<<4)|aL;
test2++;
}
else if (test2 != 0)
{
aH = toupper(BC26_UART2_RX_BUF[j]);
aL = toupper(BC26_UART2_RX_BUF[++j]);
if (aH > 0x39)
aH -= 0x37;
else
aH -= 0x30;
if (aL > 0x39)
aL -= 0x37;
else
aL -= 0x30;
m26DATA[35+test2] = (aH<<4)|aL;
test2++;
}
if(test2 == 10){break;}
}
break;
}
}