?? 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 + -