CRC32校验码主要用来检验数据在传输过程中的完整性
一、发送方
1、计算要发送数据的CRC32码
2、发送数据包
3、数据包内容 数据+CRC32码
二、接收方
1、接收数据包
2、提取 数据 和CRC32码
3、通过公式计算出数据的CRC32码
4、与数据包中的码进行对比
5、得出结果
代码示例
#include <stdio.h>
#include <windows.h>
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
#define u64 unsigned long long
u32 crc32_table[256];
void make_crc32_table();
unsigned int get_crc32_code(u8 *string, u32 size);
int main ()
{
unsigned int i;
printf(" 全国大学生电子交流群:649692007\r\n");
printf(" sizeof(unsigned char)= %d Bytes = %d bit\r\n",sizeof(unsigned char),sizeof(unsigned char)*8);
printf(" sizeof(unsigned short)= %d Bytes = %d bit\r\n",sizeof(unsigned short),sizeof(unsigned short)*8);
printf(" sizeof(unsigned int)= %d Bytes = %d bit\r\n",sizeof(unsigned int),sizeof(unsigned int)*8);
printf(" sizeof(unsigned long long)= %d Bytes = %d bit\r\n",sizeof(unsigned long long),sizeof(unsigned long long)*8);
/*生成CRC32表*/
make_crc32_table();
/*输出CRC32表*/
printf("----------------------------------------------------------------------------------------------------------------------------\r\n");
for(i=0;i<256;i++)
{ if((i!=0)&&(i%8==0))
{
printf("\r\n");
}
printf("0x%08Xh ",crc32_table[i]);
}
printf("\r\n");
printf("----------------------------------------------------------------------------------------------------------------------------\r\n");
/*定义一个字符串*/
char *p="zhoujinhao";
printf(" The crc32_code of zhoujinhao=0x%08Xh\r\n",get_crc32_code(p,sizeof(p)));
printf("得到了一个字符串的CRC32_code有什么用呢?\r\n");
printf("例:\r\n");
printf(" 如果我要发送一个字符串 zhoujinhao ,但是发送过程中可能出错,接受方怎么判断接收到的字符串有没有出错呢?\r\n");
printf(" 发送方以 zhoujinhao + crc32_code 发送,接收方分解字符串后计算出自己的的效验码,与接收字符串传过来的效验码作比较\r\n");
printf(" 若接收方计算出来的校验码和与接收方接收到的效验码不一样,就可判定接收到的字符串在传输过程中出错了,不可使用\r\n");
return 0 ;
}
void make_crc32_table()
{
u32 c = 0;
u32 i = 0;
u8 bit = 0;
for(i = 0; i < 256; i++)
{
c = (unsigned int)i;
for(bit = 0; bit < 8; bit++)
{
if(c&1)
{
c = (c >> 1)^(0xEDB88320);
}
else
{
c = c >> 1;
}
}
crc32_table[i] = c;
}
}
u32 get_crc32_code(u8 *string, u32 size)
{
u32 crc = 0xFFFFFFFF;
while(size--)
crc = (crc >> 8)^(crc32_table[(crc ^ *string++)&0xff]);
return crc;
}
//全国大学生电子交流群:649692007
//Haut:zhoujinhao
//cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT
/*小知识*****用与(&)逻辑求余*************/
//如果一个数 m 满足: m = 2^n (m是2的n次幂)
// K%m = K & (m - 1)