02、单片机C语言之CRC32校验码

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)

猜你喜欢

转载自blog.csdn.net/BaoTTing/article/details/103953135