ICCID码解析方式

最后一位校验码校验方法:

 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;
		}
 
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值