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

📄 crc64.c

📁 CRC循环64位校验的源码
💻 C
字号:


#include <stdio.h>
#include <math.h>

// POLY
// 注意:因最高位一定为“1”,故略去 

#define cnCRC_64_H	0x42F0E1EB
#define cnCRC_64_L	0xA9EA3693
//CRC-64-ECMA-182 x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + 
//x40 + x39 + x38 + x37 + x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 
//+ x21 + x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1 
//(as described in ECMA-182 p.63)  or 0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85) 

unsigned long TableCRCHigh[256];	 // CRC 表 for 64
unsigned long TableCRCLow[256];		// CRC 表 for 64

void BuildTable64();	//建立CRC表
unsigned long* CRC_64( unsigned char * aData, unsigned long aSize );		//计算CRC

unsigned char test[11] = {0x01,0x02,0x03,0xf8,0x05,0x60,0x9e,0xce,0x1e,0xcb,0xf3};

void main()
{
	unsigned int i;

	unsigned long* crc64;		//CRC结果

	BuildTable64();		//creat table

	for (i=0;i<256;i++)
	{
		printf("%x,%x\n", TableCRCHigh[i],TableCRCLow[i]);
	}

	crc64 = CRC_64(test,11);		//creat CRC  value

		printf("The CRC is:%x,%x\n", *crc64,*(crc64+1));
}

// 构造 64 位 CRC 表 
void BuildTable64() 
{ 
	unsigned long i, j; 
	unsigned long nData[2]; 
	unsigned long nAccum[2]; 

	nData[0] = 0;
	nData[1] = 0;

	for ( i = 0; i < 256; i++ ) 
	{ 
		nAccum[0] = 0;
		nAccum[1] = 0;
		nData[1] = i;

		nData[0] = nData[1]<<24;
		nData[1]  = 0;

		for ( j = 0; j < 8; j++ ) 
		{ 
			if ( (nData[0]^nAccum[0]) & 0x80000000 ) 
			{
				nAccum[0] = ((nAccum[0]<<1) | ((nAccum[1]&0x80000000)>>31)) ^ cnCRC_64_H;
				nAccum[1] = (nAccum[1]<<1) ^ cnCRC_64_L;
			}
			else 
			{
				nAccum[0] = (nAccum[0] << 1 ) | ((nAccum[1]&0x80000000)>>31);
				nAccum[1] = nAccum[1] << 1;
			}
			nData[0] = (nData[0] << 1 ) | ((nData[1]&0x80000000)>>31);
			nData[1] = nData[1] << 1;		
		} 

		TableCRCHigh[i] = nAccum[0]; 
		TableCRCLow[i]  = nAccum[1]; 
	} 
} 

// 计算 64 位 CRC-64 值 
unsigned long* CRC_64( unsigned char* aData, unsigned long aSize ) 
{ 
	unsigned long i; 
	unsigned long nAccum[2]; 
	unsigned long temp;
	unsigned long index;

	nAccum[0] = 0;
	nAccum[1] = 0;

	for ( i = 0; i < aSize; i++ ) 
	{
		temp = nAccum[0];
		index = (temp >> 24) ^ *aData++;

		nAccum[0] = ((nAccum[0] << 8 ) | ((nAccum[1]&0xff000000)>>24)) ^ TableCRCHigh[index];
		nAccum[1] = (nAccum[1] << 8) ^ TableCRCLow[index];
	}

	return nAccum; 
} 

⌨️ 快捷键说明

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