计算CDT规约的8位CRC
2011-09-21 17:44
204 查看
// 计算8位CRC
#include "stdafx.h"
//---------------------------------------------------------------------
// 计算8位CRC的函数
// 多项式 G(X)=X8+X2+X+1
// 陪集码 0xFF
// CRC初值 0x00
// 字节高位表示多项式高位
// 本函数用于演示计算原理,使用逐位计算,效率较差, 可以用于生成查找表
//---------------------------------------------------------------------
unsigned char CRC_8_bit(unsigned char *pData, int count)
{
unsigned char CRC=0x00;
for(int n = 0; n<=count; ++n )
{
// 处理的字节
unsigned char cData = 0;
if(n < count)
cData = pData
;
else
cData = 0; // 数据结束
for (int i=0;i <8;i++)
{
// CRC最高位
unsigned char bit = (CRC>>7)&0x01;
// 后续的数据位
CRC = (CRC<<1)|(cData>>7);
cData <<= 1;
// 校验
if(bit != 0)
CRC = CRC^0x07; // 生成多项式为0x07
}
}
return CRC;
}
// 按字节计算CRC8
unsigned char CRC_8_Byte(unsigned char *pData, int count)
{
// 生成查找表
static bool bCrcTableInit = false;
static unsigned char crc8Table[256] = {0};
if(!bCrcTableInit)
{
bCrcTableInit = true;
unsigned char crcB = 0;
for(int i=0; i<0x100; ++i)
{
crcB = i;
crc8Table[i] = CRC_8_bit(&crcB, 1);
}
}
// 查表计算
unsigned char CRC=0x00;
for(int n = 0; n<count; ++n )
{
CRC = crc8Table[CRC] ^ crc8Table[pData
];
}
return CRC;
}
unsigned char CRC_8(unsigned char *pData, int count)
{
return 0xFF ^ CRC_8_Byte(pData, count); // 陪集码为0xff
// 也可用
// return 0xFF ^ CRC_8_bit(pData, count);
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char data[] = {0xcb, 0xab, 0xb1, 0xad, 0x00};
unsigned char c = CRC_8(data, sizeof(data)/sizeof(data[0])); // 0x1a
return 0;
}
相关文章推荐
- STM32F10x 学习笔记4(CRC计算单元 续)
- CUDA 规约计算性能对比
- CCITT CRC-16计算原理与实现
- 计算CRC程序(CRC16)
- C# 计算CRC16
- 一款带CRC计算的串口调试软件
- 对M4芯片的CRC模块改造来计算标准CRC32
- CRC原理与计算
- CRC计算校验码过程
- STM32F10x 学习笔记4(CRC计算单元 续)
- 【TI】的1394资料整理(PCIScope、GUID、OHCIROM、CRC的计算)
- STM32的CRC计算
- crc计算
- UVa 128 Software CRC (模计算&CRC循环冗余校验码)
- 关于modbus rtu协议的CRC(循环冗余校验)在线计算
- 【实用】STM32F10x 学习笔记3、4(CRC计算单元)
- 参照安卓计算CRC16校验码的方法获取Objective-C的CRC16位校验码
- CRC计算方法与C实现
- vb.net 计算8位二进制数(包括符号位)的 原码反码补码
- CDT规约解读