📄 crc32checkmodc.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 + -