c语言实现CRC校验和

最近在摄像头采集的数据清晰度上需要加强,则在每一帧传输的数据包后边加了CRC校验和。CRC校验和有16位的,也有32位的。至于CRC校验和算法原理,我是在百度上学习的,其实网上有很多这种资料。简单的说就是CRC校验和就是将一段二进制数据进行加密(乘以一个多项式),然后得到一个校验码。将这个校验码添加在这段二进制数据后边就行了。然后接收方在接收到数据之后,再对这个校验码进行解码。
下面我就将今天的demo代码简单的注释一下:
在发送方的buffer[22]中,前二十个数据为要发送的数据,而后两位即buffer[20]和buffer[21]中的数据就是函数int CalCrc(int crc, const char *buf, int len)产生的CRC校验和。代码如下:
int main()
{
char buffer[ 22] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x01, 0x02, 0x03, 0x04 };
int crc = CalCrc( 0, buffer, 20); // crc为16位校验码
buffer[ 21] = ( char)crc; // 取校验码低八位
buffer[ 20] = ( char)(crc >> 8); // 取校验码高八位
}
在接收方,将接收到的buffer[22]中的所有数据带入函数int CalCrc(int crc, const char *buf, int len)中进行计算,若返回值为0,则说明接收的数据是正确无误的。其实在操作工程中可以使用网络抓包软件进行监控和验证。
 
int result = CalCrc( 0, buffer, 22 );
if(result == 0 )
{
  printf( " 数据传输正确 " );
}
整个demo的代码如下:
int CalCrc( int crc,  const  char *buf,  int  len)
{
    unsigned  int  byte ;
    unsigned  char  k;
    unsigned  short  ACC,TOPBIT;
//     unsigned short remainder = 0x0000;
    unsigned  short remainder =  crc;
    TOPBIT 0x8000 ;
    for ( byte =  0byte < len; ++ byte )
    {
        ACC = buf[ byte ];
        remainder ^= (ACC << 8 );
        for (k =  8; k >  0; -- k)
        {
            if (remainder &  TOPBIT)
            {
                remainder = (remainder <<  1) ^ 0x8005 ;
            }
            else
            {
                remainder = (remainder <<  1 );
            }
        }
    }
    remainder=remainder^ 0x0000 ;
    return  remainder;
}
int main( int argc, _TCHAR*  argv[])
{
    char buffer[ 22] = { 0x000x110x220x330x440x550x660x770x880x990xaa0xbb0xcc0xdd0xee0xff0x010x020x030x04 };
    int crc = CalCrc( 0, buffer,  20); // 计算得到的16位CRC校验码
    buffer[ 21] = ( char)crc; // 取校验码的低八位
    buffer[ 20] = ( char)(crc >>  8); // 取校验码的高八位
// 接收方在接收到buffer中的数据时,代入CalCrc进行计算,若result的值为0,则说明数据传输过程无误
    int result = CalCrc( 0, buffer,  22 );
    return  0 ;
}

猜你喜欢

转载自blog.csdn.net/cyq129445/article/details/80168258
今日推荐