您的位置:首页 > 其它

计算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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  table byte c