zoukankan      html  css  js  c++  java
  • IMEI修改(IMEI第十五位验证码的计算)

    最近应客户要求做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;
    }
  • 相关阅读:
    Linux c 获取cpu使用率(2)
    Linux c codeblock的使用(四):创建自己的静态函数库
    Linux c codeblock的使用(三):使用函数库
    Linux c codeblock的使用(二):在工程中编译多个文件
    Linux c codeblock的使用(一):新建一个工程
    关于warning: suggest parentheses around assignment used as truth value [-Wparentheses]|的解决方法
    Linux c使用gumbo库解析页面表单信息(三)
    Linux c获取任意路径的硬盘使用情况
    Linux c使用gumbo库解析页面表单信息(二)
    Linux c使用gumbo库解析页面表单信息(一)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3093539.html
Copyright © 2011-2022 走看看