⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc32checkmodc.c

📁 lab windows uart driver
💻 C
字号:

/*************************************************
文件名: CRC32CheckModc.c
编制者: Dong Huoming
日期:   2004-5-20
注释:   校验模块的相关函数和功能实现(C)
**************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <ansi_c.h>

//全局变量
unsigned long g_tabCRC32[256];                             //CRC32参数表数组
int g_nFlag = 1;                                           //CRC32参数表初始化标志


/***************************
//函数名:InitTabCRC32
//
//
//注释:初始化CRC32参数表
****************************/
static void InitTabCRC32()                                 
{        
	unsigned long lCrc;
	int i,j;
	
	for (i = 0; i < 256; i++)
	{
		lCrc = i;
		for (j = 0; j < 8; j++)
		{
			if (lCrc & 1)
			{
				lCrc = (lCrc >> 1) ^ 0xEDB88320;//;0x8408;
			}
			else 
			{
				lCrc >>= 1;
			}
		}
		g_tabCRC32[i] = lCrc;
	}

	/*
	for (i = 0; i < 256; i++)                                        //输出CRC32参数表
	{
		printf("%10x", g_tabCRC32[i]);
		if ((i+1) % 6 == 0)
			printf("\n");
	}
	printf("\n");*/
	
	g_nFlag = 0;
}

/***************************
//函数名:GenerateCRC32
//
//
//注释:产生CRC32校验码
****************************/
unsigned long GenerateCRC32(void* pBuf, int nLen)               
{
	unsigned long  lOldcrc32;
	unsigned long  lCrc32;
	unsigned long  lOldcrc;
	int nCharcnt;
	int nT;
	unsigned char chC;
	unsigned char* pNewBuf;

	lOldcrc32 = 0x00000000;                        //初始化为0
	nCharcnt = 0;
	
	pNewBuf = (unsigned char*)malloc(nLen + 4);    //数据块后面添加4个字节的0
    memset(pNewBuf, 0, nLen + 4);
	memcpy(pNewBuf, pBuf, nLen);
	nLen += 4;//

	if (g_nFlag)
	{
		InitTabCRC32();                            //初始化CRC32参数表
	}

	while (nLen--)
	{
		nT = (lOldcrc32 >> 24) & 0xFF;                   //要移出的字节值
		lOldcrc = g_tabCRC32[nT];                        //根据移出的字节值查表
		chC = *(pNewBuf + nCharcnt);                     //新移进来的字节值
		lOldcrc32 = (lOldcrc32 << 8) | chC;              //将新移进来的字节值添在寄存器末字节中
		lOldcrc32 = lOldcrc32 ^ lOldcrc;                 //将寄存器与查出的值进行xor运算
		nCharcnt++;		
	}

	lCrc32 = lOldcrc32;
	free(pNewBuf);
	return lCrc32;                       //返回产生的CRC32校验码
}

/************************************************
//函数名:GenerateCRC32
//
//
//注释:验证CRC32校验码,验证结果为0表示传输正确,
//而返回其他值表示传输出现错误
**************************************************/
unsigned long CheckCRC32(void* pBuf, int nLen, unsigned long lCrc32)  
{
	unsigned long lResult;
	int i;

    unsigned char* pNewBuf;                //数据块后面添加4个字节的CRC32校验码
	pNewBuf = (unsigned char*)malloc(nLen + 4);
	memset(pNewBuf, 0, nLen + 4);
	memcpy(pNewBuf, pBuf, nLen);

	for (i = 0; i < 4; i++)
	{
		pNewBuf[nLen + i] = (lCrc32 >> (24 - i * 8)) & 0xFF;
	};
	nLen += 4;

//	InitTabCRC32();                 //初始化CRC32参数表                  

	lResult = GenerateCRC32(pNewBuf, nLen);
	free(pNewBuf);
	return lResult;                 //返回值为0表示传输正确,即整除,否则传输错误
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -