当前位置:编程学习 > VC++ >>

vc++ CRC16-CCITT循环码验证算法

这段时间做串口通信总结的:

方法:先从EditBox读取十进制字符串数据,转化为十进制整数,再进行 CRC16-CCITT循环码验证算法,求的CRC值,再转化为十六进制数发送到串口。

代码:


UpdateData(TRUE);//更新,读取数据 
    int lenchar=17; 
    int dat; 
    char *DataSend=(char *)calloc(lenchar, sizeof(char));//要发送的数据 
 
    DataSend[0]=0x2; 
    DataSend[1]=0x11; 
    DataSend[2]=0x22; 
 
    int *datatmp=(int *)calloc(6, sizeof(int)); 
 
    dat=atoi(m_EditZ2);//转换EidtBox中的十进制字符串为十进制整数 
    TenToHex(dat, datatmp);//将十进制整数转化为十六进制数 
    DataSend[3]=datatmp[4]; 
    DataSend[4]=datatmp[5]; 
 
    dat=atoi(m_EditZx); 
    TenToHex(dat, datatmp); 
    DataSend[5]=datatmp[4]; 
    DataSend[6]=datatmp[5]; 
 
    dat=atoi(m_EditC2); 
    TenToHex(dat, datatmp); 
    DataSend[7]=datatmp[4]; 
    DataSend[8]=datatmp[5]; 
 
    dat=atoi(m_EditS2); 
    TenToHex(dat, datatmp); 
    DataSend[9]=datatmp[4]; 
    DataSend[10]=datatmp[5]; 
 
    dat=atoi(m_EditZy); 
    TenToHex(dat, datatmp); 
    DataSend[11]=datatmp[4]; 
    DataSend[12]=datatmp[5]; 
 
    dat=atoi(m_EditZ0); 
    TenToHex(dat, datatmp); 
    DataSend[13]=datatmp[4]; 
    DataSend[14]=datatmp[5]; 
 
    dat=CRCCCITT(lenchar, DataSend);//求CRCCCITT循环码 
    ////若循环码为负值,则需要做一下处理,这是我猜出来的,但是经过验证,结果确实对的。知其然而不知其所以然!!!   
    if (dat<0) 
    { 
        dat=abs(dat)-1; 
    } 
    TenToHex(dat, datatmp); 
    DataSend[15]=datatmp[5];//此时与上面的不同 
    DataSend[16]=datatmp[4]; 

<span style="BACKGROUND-COLOR: #33ff33"> 将十进制整数转化为十六进制数:TenToHex(dat, datatmp)函数的实现(假设dat只有两个字节大小):</span> 

void CDialog2::TenToHex(int c, int *b) 

    for (int i=0; i<6; i++) 
    { 
        b[i]=0; 
    } 
    int n,k=1,j; 
    int i=0; 
    if(c<256) 
    { 
        b[4]=0; 
        b[5]=c; 
    } 
    else 
    { 
        b[0]=c%16; 
        c=c/16; 
        while(c>16) 
        { 
            b[k]=c%16; 
            k++; 
            c=c/16; 
        } 
        b[k]=c; 
        b[4]=b[3]*16+b[2]; 
        b[5]=b[1]*16+b[0]; 
 
    } 
 

求CRCCCITT循环码:


int CDialog2::CRCCCITT(int lenchar, char *data) 

    int len,CRC=0; 
    len=lenchar-2; 
    int poly =0x8408; 
    for (int i=0; i<len; i++) 
    { 
 
        CRC=CRC^data[i]; 
 
        for (int j=0; j<8; j++) 
        { 
            if ((CRC&0x0001)!=0) 
            { 
                CRC>>=1; 
                CRC=CRC^poly; 
            } 
            else 
            { 
                CRC>>=1; 
            } 
        } 
    } 
    return CRC; 

 独立的求CRC-CCITT程序: www.zzzyk.com


int CRCCCITT(int len, char *data) 

    int CRC=0; 
    int poly =0x8408; 
    for (int i=0; i<len; i++) 
    { 
 
        CRC=CRC^data[i]; 
 
        for (int j=0; j<8; j++) 
        { 
            if ((CRC&0x0001)!=0) 
            { 
                CRC>>=1; 
                CRC=CRC^poly; 
            } 
            else 
            { 
                CRC>>=1; 
            } 
        } 
    } 
    return CRC; 

 

摘自 myj0513的专栏
 

补充:软件开发 , Vc ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,