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