当前位置: 首页>編程日記>正文

CRC8校验方式

CRC8校验方式

1、 CRC8标准生成多项式

CRC-8 x8+x5+x4+1 0x31(0x131)
CRC-8 x8+x2+x1+1 0x07(0x107)
CRC-8 x8+x6+x4+x3+x2+x1 0x5E(0x15E

2.以下都以x8+x5+x4+1为例

先计算第一个字节的crc结果,然后把第一个字节的crc结果与第二个字节进行异或,
异或后的值再进行一次crc计算就可以了,多个字节也是反复这过程就好,如下为多个字节
的crc校验代码:

unsigned char crc_high_first(unsigned char ptr, unsigned char len)
{
unsigned char i;
unsigned char crc=0x00; /
计算的初始crc值 */

while(len--)
{crc ^= *ptr++;  /* 每次先与需要计算的数据异或,计算完指向下一数据 */  for (i=8; i>0; --i)   /* 下面这段计算过程与计算一个字节crc一样 */  { if (crc & 0x80)crc = (crc << 1) ^ 0x31;elsecrc = (crc << 1);}
}return (crc); 

}
上面的crc计算是纯采用逻辑运行的方式,可以看到,需要的运行量也是不少的,每一个字节
都需要进行8次判断、移位、或异或操作。可以采用查表法,大大减少计算量,先计算出
0x00~0xFF每一个字节的crc校验结果,后面就可以通过表来查出每个字节的crc结果,大大
减少计算量。
下面是一个表生成程序:
(生成表对应多项式:0x31(多项式:x8+x5+x4+1,100110001))

void  create_crc_table(void)
{unsigned short i;unsigned char j;for (i=0; i<=0xFF; i++){if (0 == (i%16))printf("\n");j = i&0xFF;printf("0x%.2x, ", cal_table_high_first (j));  /*依次计算每个字节的crc校验值*/}
}

得到的表整理后如下:

static const unsigned char crc_table[] =
{
0x00,0x31,0x62,0x53,0xc4,0xf5,0xa6,0x97,0xb9,0x88,0xdb,0xea,0x7d,0x4c,0x1f,0x2e,
0x43,0x72,0x21,0x10,0x87,0xb6,0xe5,0xd4,0xfa,0xcb,0x98,0xa9,0x3e,0x0f,0x5c,0x6d,
0x86,0xb7,0xe4,0xd5,0x42,0x73,0x20,0x11,0x3f,0x0e,0x5d,0x6c,0xfb,0xca,0x99,0xa8,
0xc5,0xf4,0xa7,0x96,0x01,0x30,0x63,0x52,0x7c,0x4d,0x1e,0x2f,0xb8,0x89,0xda,0xeb,
0x3d,0x0c,0x5f,0x6e,0xf9,0xc8,0x9b,0xaa,0x84,0xb5,0xe6,0xd7,0x40,0x71,0x22,0x13,
0x7e,0x4f,0x1c,0x2d,0xba,0x8b,0xd8,0xe9,0xc7,0xf6,0xa5,0x94,0x03,0x32,0x61,0x50,
0xbb,0x8a,0xd9,0xe8,0x7f,0x4e,0x1d,0x2c,0x02,0x33,0x60,0x51,0xc6,0xf7,0xa4,0x95,
0xf8,0xc9,0x9a,0xab,0x3c,0x0d,0x5e,0x6f,0x41,0x70,0x23,0x12,0x85,0xb4,0xe7,0xd6,
0x7a,0x4b,0x18,0x29,0xbe,0x8f,0xdc,0xed,0xc3,0xf2,0xa1,0x90,0x07,0x36,0x65,0x54,
0x39,0x08,0x5b,0x6a,0xfd,0xcc,0x9f,0xae,0x80,0xb1,0xe2,0xd3,0x44,0x75,0x26,0x17,
0xfc,0xcd,0x9e,0xaf,0x38,0x09,0x5a,0x6b,0x45,0x74,0x27,0x16,0x81,0xb0,0xe3,0xd2,
0xbf,0x8e,0xdd,0xec,0x7b,0x4a,0x19,0x28,0x06,0x37,0x64,0x55,0xc2,0xf3,0xa0,0x91,
0x47,0x76,0x25,0x14,0x83,0xb2,0xe1,0xd0,0xfe,0xcf,0x9c,0xad,0x3a,0x0b,0x58,0x69,
0x04,0x35,0x66,0x57,0xc0,0xf1,0xa2,0x93,0xbd,0x8c,0xdf,0xee,0x79,0x48,0x1b,0x2a,
0xc1,0xf0,0xa3,0x92,0x05,0x34,0x67,0x56,0x78,0x49,0x1a,0x2b,0xbc,0x8d,0xde,0xef,
0x82,0xb3,0xe0,0xd1,0x46,0x77,0x24,0x15,0x3b,0x0a,0x59,0x68,0xff,0xce,0x9d,0xac
};
采用查表法计算crc代码如下:

unsigned char cal_crc_table(unsigned char *ptr, unsigned char len)
{
unsigned char crc = 0x00;

while (len--)
{crc = crc_table[crc ^ *ptr++];
}
return (crc);

}

反序异或的计算
反序异或与顺序异或差异在数据先判断最低位,并且数据是向右移
的,并且多项式数据位需要高低位反转一下。
还是以多项式:x8+x5+x4+1(二进制为:100110001)为例:
则计算一个字节的crc校验代码如下:

unsigned char cal_table_low_first(unsigned char value)
{
unsigned char i, crc;

crc = value;

/* 同样需要计算8次 /
for (i=8; i>0; --i)
{
if (crc & 0x01) /
反序异或变成判断最低位是否为1 /
/
数据变成往右移位了 /
/
计算的多项式从0x31(0011 0001)变成了0x8C (1000 1100) /
/
多项式值,原来的最高位变成了最低位,原来的最低位变成最高位,8位数据高低位交换一下位置 */
crc = (crc >> 1) ^ 0x8C;
else
crc = (crc >> 1);
}

return crc;

}
至于多个字节的crc校验及crc数据表的生成,只要把单个字节的计算方式替换一下顺序的
计算方式即可,这里就不再列出。所以,只要明确了crc校验使用的多项式,高位先校验
还是低位先校验,计算crc的初始值是什么,那crc的计算就变得很简单了。


https://www.fengoutiyan.com/post/15570.html

相关文章:

  • 数据校验方式
  • 如何进行数据校验
  • 串口校验有哪几种方式
  • 什么是crc校验
  • 和校验与crc校验的区别
  • 16位crc校验
  • crc校验方法
  • 如果采用偶校验方式
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機