精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文講透CRC校驗碼-附贈C語言實例

開發 后端
數據通信領域中最常用的一種差錯校驗碼,其信息字段和校驗字段長度可以任意指定,但要求通信雙方定義的CRC標準一致。主要用來檢測或校驗數據傳輸或者保存后可能出現的錯誤。

[[408061]]

一口君最近工作用到CRC校驗,順便整理本篇文章和大家一起研究。

一、CRC概念

1. 什么是CRC?

CRC(Cyclic Redundancy Checksum)是一種糾錯技術,代表循環冗余校驗和。

數據通信領域中最常用的一種差錯校驗碼,其信息字段和校驗字段長度可以任意指定,但要求通信雙方定義的CRC標準一致。主要用來檢測或校驗數據傳輸或者保存后可能出現的錯誤。它的使用方式可以說明如下圖所示:

在數據傳輸過程中,無論傳輸系統的設計再怎么完美,差錯總會存在,這種差錯可能會導致在鏈路上傳輸的一個或者多個幀被破壞(出現比特差錯,0變為1,或者1變為0),從而接受方接收到錯誤的數據。

為盡量提高接受方收到數據的正確率,在接收方接收數據之前需要對數據進行差錯檢測,當且僅當檢測的結果為正確時接收方才真正收下數據。檢測的方式有多種,常見的有奇偶校驗、因特網校驗和循環冗余校驗等。

2. 使用方法概述

循環冗余校驗是一種用于校驗通信鏈路上數字傳輸準確性的計算方法(通過某種數學運算來建立數據位和校驗位的約定關系的 )。

發送方計算機使用某公式計算出被傳送數據所含信息的一個值,并將此值 附在被傳送數據后,接收方計算機則對同一數據進行 相同的計算,應該得到相同的結果。

如果這兩個 CRC結果不一致,則說明發送中出現了差錯,接收方計算機可要求發送方計算機重新發送該數據。

3. 應用廣泛

在諸多檢錯手段中,CRC是最著名的一種。CRC的全稱是循環冗余校驗,其特點是:檢錯能力強,開銷小,易于用編碼器及檢測電路實現。從其檢錯能力來看,它所不能發現的錯誤的幾率僅為0.0047%以下。

從性能上和開銷上考慮,均遠遠優于奇偶校驗及算術和校驗等方式。

因而,在數據存儲和數據通訊領域,CRC無處不在:著名的通訊協議X.25的FCS(幀檢錯序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等壓縮工具軟件采用的是CRC32,磁盤驅動器的讀寫采用了CRC16,通用的圖像存儲格式GIF、TIFF等也都用CRC作為檢錯手段。

二、CRC名稱的定義

這里需要知道幾個組成部分或者說計算概念:多項式公式、多項式簡記式、數據寬度、初始值、結果異或值、輸入值反轉、輸出值反轉、參數模型。

1、多項式公式

對于CRC標準除數,一般使用多項式(或二項式)公式表示,如下圖中除數11011(poly值為0x1c)的二項式為G(X)=X4+X3+X+1,X的指數就代表了該bit位上的數據為1,(最低位為0)。

這里特別注意一下位數問題,除數的位數為二項式最高次冪+1(4+1=5),這個很重要。

2、多項式簡記式

通過對CRC的基本了解我們知道,多項式的首尾必定為1,而這個1的位置在下一步計算一定為0,所以就把前面這個1給省略掉了,出現了一個叫簡記式的東西,如上例中除數11011的簡記式為1011,很多看過CRC高級語言源碼的人會知道,對于CRC_16標準下G(X)=X16+X15+X2+1(16#18005)的poly值實際上是8005,這里使用的就是簡記式。后面會對這個用法做一個說明。

3、數據寬度

數據寬度指的就是CRC校驗碼的長度(二進制位數),知道了CRC的運算概念和多項式,就可以理解這個概念了,CRC長度始終要比除數位數少1,與簡記式長度是一致的。

以上三個數據就是我們經常能夠用到的基本數據

4、初始值與結果異或值

在一些標準中,規定了初始值,則數據在進行上述二項式運算之前,需要先將要計算的數據與初始值的最低字節進行異或,然后再與多項式進行計算。

而在結果異或值不為零的情況下,則需要將計算得到的CRC結果值再與結果異或值進行一次異或計算,得到的最終值才是我們需要的CRC校驗碼。

這里可以看出,初始值與結果值的位數要求與數據寬度一致。

5、輸入值反轉與輸出值反轉

輸入值反轉的意思是在計算之前先將二項式反轉,然后再用得到的新值和數據進行計算。如對于G(X)=X16+X15+X2+1(16#18005),其正向值為1 1000 0000 0000 0101,反轉值則為1010 0000 0000 0001 1

輸出值反轉則是將最終得到的CRC結果反轉。

通常,輸入值反轉后的結果值也會是反轉的,所以這兩個選項一般是同向的,我們只有在在線CRC計算器中會看到自由選擇正反轉的情況存在。

三、常見的CRC算法

雖然CRC可以任意定義二項式、數據長度等,但沒有一個統一的標準的話,就會讓整個計算變得非常的麻煩。但實際上,不同的廠家經常采用不同的標準算法,這里列出了一些國際常用的模型表:

名稱 多項式 表示法 應用舉例
CRC-8 X8+X2+X+1 0X107  
CRC-12 X12+X11+X3+X2+X+1 0X180F telecom systems
CRC-16 X16+X15+X2+1 0X18005 Bisync, Modbus, USB, ANSI X3.28, SIA DC-07, many others; also known as CRC-16 and CRC-16-ANSI
CRC-CCITT X16+X12+X5+1 0X11021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS
CRC-32 X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1 0x104C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS
CRC-32C X32+X28+X27+X26+X25+X23+X22+X20+X19+X18+X14+X13+X11+X10+X9+X8+X6+1 0x11EDC6F41 iSCSI, SCTP, G.hn payload, SSE4.2, Btrfs, ext4, Ceph

四、CRC校驗算法前置知識

在學習CRC校驗算法之前,先復習一下CRC會涉及的主要幾個主要的算法。

1. 異或

異或,就是不同為1,相同為0,運算符號是^。

  1. 0^0 = 0 
  2. 0^1 = 1 
  3. 1^1 = 0 
  4. 1^0 = 1 

異或運算存在如下幾個規律,需要了解。

  1. 0^x = x 即0 異或任何數等于任何數 
  2. 1^x = ~x 即1異或任何數等于任何數取反 
  3. x^x = 0 即任何數與自己異或,結果為0 
  4. a ^ b = b ^ a 交換律 
  5. a ^ (b ^ c) = (a ^ b) ^c 結合律 

2. 模2加法

模2加法相對于普通的算術加法,主要的區別在模2加法,不做進位處理。具體結果如下。0+0 = 0 0+1 = 1 1+1 = 0 1+0 = 1 我們發現模2加法的計算結果,同異或運算結果一模一樣。進一步推演,我們會發現,異或運算的5個規律,同樣適合于模2加法。這里,就不在一一列舉了。

3. 模2減法

模2減法相對于普通的算術減法,主要的區別在模2減法,不做借位處理。具體結果如下。0-0 = 0 0-1 = 1 1-1 = 0 1-0 = 1 我們發現模2減法的計算結果,同模2加法,以及異或的運算結果一模一樣。進一步推演,我們會發現,異或運算的5個規律,同樣適合于模2減法。這里,就不在一一列舉了。

4. 模2除法

模2除法相對于普通的算術除法,主要的區別在模2除法,它既不向上位借位,也不比較除數和被除數的相同位數值的大小,只要以相同位數進行相除即可。

五、CRC原理

CRC原理:在K位信息碼(目標發送數據)后再拼接R位校驗碼,使整個編碼長度為N位,因此這種編碼也叫(N,K)碼。

通俗的說,就是在需要發送的信息后面附加一個數(即校驗碼),生成一個新的發送數據發送給接收端。這個數據要求能夠使生成的新數據被一個特定的數整除。這里的整除需要引入模 2除法的概念。

那么,CRC校驗的具體做法就是

(1)選定一個標準除數(K位二進制數據串)

(2)在要發送的數據(m位)后面加上K-1位0,然后將這個新數(M+K-1位)以模2除法的方式除以上面這個標準除數,所得到的余數也就是該數據的CRC校驗碼(注:余數必須比除數少且只少一位,不夠就補0)

(3)將這個校驗碼附在原m位數據后面,構成新的M+K-1位數據,發送給接收端。

(4)接收端將接收到的數據除以標準除數,如果余數為0則認為數據正確。

注意:CRC校驗中有兩個關鍵點:

一是要預先確定一個發送端和接收端都用來作為除數的二進制比特串(或多項式);

二是把原始幀與上面選定的除進行二進制除法運算,計算出FCS。

前者可以隨機選擇,也可按國際上通行的標準選擇,但最高位和最低位必須均為“1”

六、循環冗余的計算

實例:

由于CRC-32、CRC-16、CCITT和CRC-4的編碼過程基本一致,只有位數和生成多項式不一樣,下面就舉例,來說明CRC校驗碼生成過程。

對于數據1110 0101(16#E5),以指定除數11011求它的CRC校驗碼,其過程如下:

使用上面計算的校驗和和消息數據,可以創建要傳輸的碼字。

有時候,我們需要填充checksum到制定的位置,這就涉及到字節序問題,建議用memcpy()進行拷貝。

七、代碼實現

實現算法參考網絡相關代碼,進行整理并驗證,可直接使用。crc.c

  1. /*   
  2.  *一口Linux 
  3.  *2021.6.21 
  4.  *version: 1.0.0 
  5. */ 
  6. #include "crc.h" 
  7. #include <stdio.h> 
  8.  
  9. typedef enum { 
  10.  REF_4BIT = 4, 
  11.  REF_5BIT = 5, 
  12.  REF_6BIT = 6, 
  13.  REF_7BIT = 7, 
  14.  REF_8BIT = 8, 
  15.  REF_16BIT = 16, 
  16.  REF_32BIT = 32 
  17. }REFLECTED_MODE; 
  18.  
  19. uint32_t ReflectedData(uint32_t data, REFLECTED_MODE mode) 
  20.  data = ((data & 0xffff0000) >> 16) | ((data & 0x0000ffff) << 16); 
  21.  data = ((data & 0xff00ff00) >> 8) | ((data & 0x00ff00ff) << 8); 
  22.  data = ((data & 0xf0f0f0f0) >> 4) | ((data & 0x0f0f0f0f) << 4); 
  23.  data = ((data & 0xcccccccc) >> 2) | ((data & 0x33333333) << 2); 
  24.  data = ((data & 0xaaaaaaaa) >> 1) | ((data & 0x55555555) << 1); 
  25.  
  26.  switch (mode) 
  27.  { 
  28.  case REF_32BIT: 
  29.   return data; 
  30.  case REF_16BIT: 
  31.   return (data >> 16) & 0xffff; 
  32.  case REF_8BIT: 
  33.   return (data >> 24) & 0xff; 
  34.  case REF_7BIT: 
  35.   return (data >> 25) & 0x7f; 
  36.  case REF_6BIT: 
  37.   return (data >> 26) & 0x7f; 
  38.  case REF_5BIT: 
  39.   return (data >> 27) & 0x1f; 
  40.  case REF_4BIT: 
  41.   return (data >> 28) & 0x0f; 
  42.  } 
  43.  return 0; 
  44.  
  45. uint8_t CheckCrc4(uint8_t poly, uint8_t init, bool refIn, bool refOut, uint8_t xorOut, 
  46.  const uint8_t *buffer, uint32_t length) 
  47.  uint8_t i; 
  48.  uint8_t crc; 
  49.  
  50.  if (refIn == true
  51.  { 
  52.   crc = init; 
  53.   poly = ReflectedData(poly, REF_4BIT); 
  54.  
  55.   while (length--) 
  56.   { 
  57.    crc ^= *buffer++; 
  58.    for (i = 0; i < 8; i++) 
  59.    { 
  60.     if (crc & 0x01) 
  61.     { 
  62.      crc >>= 1; 
  63.      crc ^= poly; 
  64.     } 
  65.     else 
  66.     { 
  67.      crc >>= 1; 
  68.     } 
  69.    } 
  70.   } 
  71.  
  72.   return crc ^ xorOut; 
  73.  } 
  74.  else 
  75.  { 
  76.   crc = init << 4; 
  77.   poly <<= 4; 
  78.  
  79.   while (length--) 
  80.   { 
  81.    crc ^= *buffer++; 
  82.    for (i = 0; i < 8; i++) 
  83.    { 
  84.     if (crc & 0x80) 
  85.     { 
  86.      crc <<= 1; 
  87.      crc ^= poly; 
  88.     } 
  89.     else 
  90.     { 
  91.      crc <<= 1; 
  92.     } 
  93.    } 
  94.   } 
  95.  
  96.   return (crc >> 4) ^ xorOut; 
  97.  } 
  98.  
  99. uint8_t CheckCrc5(uint8_t poly, uint8_t init, bool refIn, bool refOut, uint8_t xorOut, 
  100.  const uint8_t *buffer, uint32_t length) 
  101.  uint8_t i; 
  102.  uint8_t crc; 
  103.  
  104.  if (refIn == true
  105.  { 
  106.   crc = init; 
  107.   poly = ReflectedData(poly, REF_5BIT); 
  108.  
  109.   while (length--) 
  110.   { 
  111.    crc ^= *buffer++; 
  112.    for (i = 0; i < 8; i++) 
  113.    { 
  114.     if (crc & 0x01) 
  115.     { 
  116.      crc >>= 1; 
  117.      crc ^= poly; 
  118.     } 
  119.     else 
  120.     { 
  121.      crc >>= 1; 
  122.     } 
  123.    } 
  124.   } 
  125.  
  126.   return crc ^ xorOut; 
  127.  } 
  128.  else 
  129.  { 
  130.   crc = init << 3; 
  131.   poly <<= 3; 
  132.  
  133.   while (length--) 
  134.   { 
  135.    crc ^= *buffer++; 
  136.    for (i = 0; i < 8; i++) 
  137.    { 
  138.     if (crc & 0x80) 
  139.     { 
  140.      crc <<= 1; 
  141.      crc ^= poly; 
  142.     } 
  143.     else 
  144.     { 
  145.      crc <<= 1; 
  146.     } 
  147.    } 
  148.   } 
  149.  
  150.   return (crc >> 3) ^ xorOut; 
  151.  } 
  152.  
  153. uint8_t CheckCrc6(uint8_t poly, uint8_t init, bool refIn, bool refOut, uint8_t xorOut, 
  154.  const uint8_t *buffer, uint32_t length) 
  155.  uint8_t i; 
  156.  uint8_t crc; 
  157.  
  158.  if (refIn == true
  159.  { 
  160.   crc = init; 
  161.   poly = ReflectedData(poly, REF_6BIT); 
  162.  
  163.   while (length--) 
  164.   { 
  165.    crc ^= *buffer++; 
  166.    for (i = 0; i < 8; i++) 
  167.    { 
  168.     if (crc & 0x01) 
  169.     { 
  170.      crc >>= 1; 
  171.      crc ^= poly; 
  172.     } 
  173.     else 
  174.     { 
  175.      crc >>= 1; 
  176.     } 
  177.    } 
  178.   } 
  179.  
  180.   return crc ^ xorOut; 
  181.  } 
  182.  else 
  183.  { 
  184.   crc = init << 2; 
  185.   poly <<= 2; 
  186.  
  187.   while (length--) 
  188.   { 
  189.    crc ^= *buffer++; 
  190.    for (i = 0; i < 8; i++) 
  191.    { 
  192.     if (crc & 0x80) 
  193.     { 
  194.      crc <<= 1; 
  195.      crc ^= poly; 
  196.     } 
  197.     else 
  198.     { 
  199.      crc <<= 1; 
  200.     } 
  201.    } 
  202.   } 
  203.  
  204.   return (crc >> 2) ^ xorOut; 
  205.  } 
  206.  
  207. uint8_t CheckCrc7(uint8_t poly, uint8_t init, bool refIn, bool refOut, uint8_t xorOut, 
  208.  const uint8_t *buffer, uint32_t length) 
  209.  uint8_t i; 
  210.  uint8_t crc; 
  211.  
  212.  if (refIn == true
  213.  { 
  214.   crc = init; 
  215.   poly = ReflectedData(poly, REF_7BIT); 
  216.  
  217.   while (length--) 
  218.   { 
  219.    crc ^= *buffer++; 
  220.    for (i = 0; i < 8; i++) 
  221.    { 
  222.     if (crc & 0x01) 
  223.     { 
  224.      crc >>= 1; 
  225.      crc ^= poly; 
  226.     } 
  227.     else 
  228.     { 
  229.      crc >>= 1; 
  230.     } 
  231.    } 
  232.   } 
  233.  
  234.   return crc ^ xorOut; 
  235.  } 
  236.  else 
  237.  { 
  238.   crc = init << 1; 
  239.   poly <<= 1; 
  240.  
  241.   while (length--) 
  242.   { 
  243.    crc ^= *buffer++; 
  244.    for (i = 0; i < 8; i++) 
  245.    { 
  246.     if (crc & 0x80) 
  247.     { 
  248.      crc <<= 1; 
  249.      crc ^= poly; 
  250.     } 
  251.     else 
  252.     { 
  253.      crc <<= 1; 
  254.     } 
  255.    } 
  256.   } 
  257.  
  258.   return (crc >> 1) ^ xorOut; 
  259.  } 
  260.  
  261. uint8_t CheckCrc8(uint8_t poly, uint8_t init, bool refIn, bool refOut, uint8_t xorOut, 
  262.  const uint8_t *buffer, uint32_t length) 
  263.  uint32_t i = 0; 
  264.  uint8_t crc = init; 
  265.  
  266.  while (length--) 
  267.  { 
  268.   if (refIn == true
  269.   { 
  270.    crc ^= ReflectedData(*buffer++, REF_8BIT); 
  271.   } 
  272.   else 
  273.   { 
  274.    crc ^= *buffer++; 
  275.   } 
  276.  
  277.   for (i = 0; i < 8; i++) 
  278.   { 
  279.    if (crc & 0x80) 
  280.    { 
  281.     crc <<= 1; 
  282.     crc ^= poly; 
  283.    } 
  284.    else 
  285.    { 
  286.     crc <<= 1; 
  287.    } 
  288.   } 
  289.  } 
  290.  
  291.  if (refOut == true
  292.  { 
  293.   crc = ReflectedData(crc, REF_8BIT); 
  294.  } 
  295.  
  296.  return crc ^ xorOut; 
  297.  
  298. uint16_t CheckCrc16(uint16_t poly, uint16_t init, bool refIn, bool refOut, uint16_t xorOut, 
  299.  const uint8_t *buffer, uint32_t length) 
  300.  uint32_t i = 0; 
  301.  uint16_t crc = init; 
  302.  
  303.  while (length--) 
  304.  { 
  305.   if (refIn == true
  306.   { 
  307.    crc ^= ReflectedData(*buffer++, REF_8BIT) << 8; 
  308.   } 
  309.   else 
  310.   { 
  311.    crc ^= (*buffer++) << 8; 
  312.   } 
  313.  
  314.   for (i = 0; i < 8; i++) 
  315.   { 
  316.    if (crc & 0x8000) 
  317.    { 
  318.     crc <<= 1; 
  319.     crc ^= poly; 
  320.    } 
  321.    else 
  322.    { 
  323.     crc <<= 1; 
  324.    } 
  325.   } 
  326.  } 
  327.  
  328.  if (refOut == true
  329.  { 
  330.   crc = ReflectedData(crc, REF_16BIT); 
  331.  } 
  332.  
  333.  return crc ^ xorOut; 
  334.  
  335. uint32_t CheckCrc32(uint32_t poly, uint32_t init, bool refIn, bool refOut, uint32_t xorOut, 
  336.  const uint8_t *buffer, uint32_t length) 
  337.  uint32_t i = 0; 
  338.  uint32_t crc = init; 
  339.  
  340.  while (length--) 
  341.  { 
  342.   if (refIn == true
  343.   { 
  344.    crc ^= ReflectedData(*buffer++, REF_8BIT) << 24; 
  345.   } 
  346.   else 
  347.   { 
  348.    crc ^= (*buffer++) << 24; 
  349.   } 
  350.  
  351.   for (i = 0; i < 8; i++) 
  352.   { 
  353.    if (crc & 0x80000000) 
  354.    { 
  355.     crc <<= 1; 
  356.     crc ^= poly; 
  357.    } 
  358.    else 
  359.    { 
  360.     crc <<= 1; 
  361.    } 
  362.   } 
  363.  } 
  364.  
  365.  if (refOut == true
  366.  { 
  367.   crc = ReflectedData(crc, REF_32BIT); 
  368.  } 
  369.  
  370.  return crc ^ xorOut; 
  371.  
  372. uint32_t CrcCheck(CRC_Type crcType, const uint8_t *buffer, uint32_t length) 
  373.  switch (crcType.width) 
  374.  { 
  375.  case 4: 
  376.   return CheckCrc4(crcType.poly, crcType.init, crcType.refIn, crcType.refOut, 
  377.    crcType.xorOut, buffer, length); 
  378.  case 5: 
  379.   return CheckCrc5(crcType.poly, crcType.init, crcType.refIn, crcType.refOut, 
  380.    crcType.xorOut, buffer, length); 
  381.  case 6: 
  382.   return CheckCrc6(crcType.poly, crcType.init, crcType.refIn, crcType.refOut, 
  383.    crcType.xorOut, buffer, length); 
  384.  case 7: 
  385.   return CheckCrc7(crcType.poly, crcType.init, crcType.refIn, crcType.refOut, 
  386.    crcType.xorOut, buffer, length); 
  387.  case 8: 
  388.   return CheckCrc8(crcType.poly, crcType.init, crcType.refIn, crcType.refOut, 
  389.    crcType.xorOut, buffer, length); 
  390.  case 16: 
  391.   return CheckCrc16(crcType.poly, crcType.init, crcType.refIn, crcType.refOut, 
  392.    crcType.xorOut, buffer, length); 
  393.  case 32: 
  394.   return CheckCrc32(crcType.poly, crcType.init, crcType.refIn, crcType.refOut, 
  395.    crcType.xorOut, buffer, length); 
  396.  } 
  397.  return 0; 

crc.h

  1. /*   
  2.  *一口Linux 
  3.  *2021.6.21 
  4.  *version: 1.0.0 
  5. */ 
  6. #ifndef __CRC_H__ 
  7. #define __CRC_H__ 
  8.  
  9. #include <stdint.h> 
  10. #include <stdbool.h> 
  11.  
  12. typedef struct { 
  13.  uint8_t width; 
  14.  uint32_t poly; 
  15.  uint32_t init; 
  16.  bool refIn; 
  17.  bool refOut; 
  18.  uint32_t xorOut; 
  19. }CRC_Type; 
  20.  
  21. uint32_t CrcCheck(CRC_Type crcType, const uint8_t *buffer, uint32_t length); 
  22.  
  23. #endif 

main.c

  1. /*   
  2.  *一口Linux 
  3.  *2021.6.21 
  4.  *version: 1.0.0 
  5. */ 
  6. #include <stdio.h> 
  7. #include <stdint.h> 
  8. #include <stdbool.h> 
  9. #include "crc.h" 
  10.  
  11. #define LENGTH 8 
  12. const uint8_t data[3][LENGTH] = { 
  13.  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }, 
  14.  { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }, 
  15.  { 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f }}; 
  16.  
  17. typedef struct { 
  18.  CRC_Type crcType; 
  19.  uint32_t result[3]; 
  20. }CRC_Test; 
  21.  
  22. CRC_Test crc4_ITU = { { 4, 0x03, 0x00, truetrue, 0x00 }, { 0x0f, 0x0a, 0x0e } }; 
  23. CRC_Test crc5_EPC = { { 5, 0x09, 0x09, falsefalse, 0x00 }, { 0x00, 0x0c, 0x17 } }; 
  24. CRC_Test crc5_ITU = { { 5, 0x15, 0x00, truetrue, 0x00 }, { 0x16, 0x0a, 0x17 } }; 
  25. CRC_Test crc5_USB = { { 5, 0x05, 0x1f, truetrue, 0x1f }, { 0x10, 0x09, 0x17 } }; 
  26. CRC_Test crc6_ITU = { { 6, 0x03, 0x00, truetrue, 0x00 }, { 0x1d, 0x30, 0x00 } }; 
  27. CRC_Test crc7_MMC = { { 7, 0x09, 0x00, falsefalse, 0x00 }, { 0x57, 0x30, 0x5b } }; 
  28. CRC_Test crc8 = { { 8, 0x07, 0x00, falsefalse, 0x00 }, { 0x3e, 0xe1, 0x36 } }; 
  29. CRC_Test crc8_ITU = { { 8, 0x07, 0x00, falsefalse, 0x55 }, { 0x6b, 0xb4, 0x63 } }; 
  30. CRC_Test crc8_ROHC = { { 8, 0x07, 0xff, truetrue, 0x00 }, { 0x6b, 0x78, 0x93 } }; 
  31. CRC_Test crc8_MAXIM = { { 8, 0x31, 0x00, truetrue, 0x00 }, { 0x83, 0x60, 0xa9 } }; 
  32. CRC_Test crc16_IBM = { { 16, 0x8005, 0x0000, truetrue, 0x0000 }, { 0xc4f0, 0x2337, 0xa776 } }; 
  33. CRC_Test crc16_MAXIM = { { 16, 0x8005, 0x0000, truetrue, 0xffff }, { 0x3b0f, 0xdcc8, 0x5889 } }; 
  34. CRC_Test crc16_USB = { { 16, 0x8005, 0xffff, truetrue, 0xffff }, { 0x304f, 0xd788, 0x53c9 } }; 
  35. CRC_Test crc16_MODBUS = { { 16, 0x8005, 0xffff, truetrue, 0x0000 }, { 0xcfb0, 0x2877, 0xac36 } }; 
  36. CRC_Test crc16_CCITT = { { 16, 0x1021, 0x0000, truetrue, 0x0000 }, { 0xeea7, 0xfe7c, 0x7919 } }; 
  37. CRC_Test crc16_CCITT_FALSE = { { 16, 0x1021, 0xffff, falsefalse, 0x0000 }, { 0x4792, 0x13a7, 0xb546 } }; 
  38. CRC_Test crc16_X25 = { { 16, 0x1021, 0xffff, truetrue, 0xffff }, { 0x6dd5, 0x7d0f, 0xfa6a } }; 
  39. CRC_Test crc16_XMODEM = { { 16, 0x1021, 0x0000, falsefalse, 0x0000 }, { 0x76ac, 0x2299, 0x8478 } }; 
  40. CRC_Test crc16_DNP = { { 16, 0x3D65, 0x0000, truetrue, 0xffff }, { 0x7bda, 0x0535, 0x08c4 } }; 
  41. CRC_Test crc32 = { { 32, 0x04c11db7, 0xffffffff, truetrue, 0xffffffff }, { 0x3fca88c5, 0xe0631a53, 0xa4051a26 } }; 
  42. CRC_Test crc32_MPEG2 = { { 32, 0x4c11db7, 0xffffffff, falsefalse, 0x00000000 }, { 0x14dbbdd8, 0x6509b4b6, 0xcb09d294 } }; 
  43.  
  44. void CrcTest(CRC_Test crcTest) 
  45.  uint32_t i; 
  46.  for (i = 0; i < 3; i++) 
  47.  { 
  48.   printf("%08x\t%08x\r\n", CrcCheck(crcTest.crcType, data[i], LENGTH), crcTest.result[i]); 
  49.  } 
  50.  printf("\r\n"); 
  51.  
  52. int main(void) 
  53.  CrcTest(crc4_ITU); 
  54.  CrcTest(crc5_EPC); 
  55.  CrcTest(crc5_ITU); 
  56.  CrcTest(crc5_USB); 
  57.  CrcTest(crc6_ITU); 
  58.  CrcTest(crc7_MMC); 
  59.  CrcTest(crc8); 
  60.  CrcTest(crc8_ITU); 
  61.  CrcTest(crc8_ROHC); 
  62.  CrcTest(crc8_MAXIM); 
  63.  CrcTest(crc16_IBM); 
  64.  CrcTest(crc16_MAXIM); 
  65.  CrcTest(crc16_USB); 
  66.  CrcTest(crc16_MODBUS); 
  67.  CrcTest(crc16_CCITT); 
  68.  CrcTest(crc16_CCITT_FALSE); 
  69.  CrcTest(crc16_X25); 
  70.  CrcTest(crc16_XMODEM); 
  71.  CrcTest(crc16_DNP); 
  72.  CrcTest(crc32); 
  73.  CrcTest(crc32_MPEG2); 
  74.  
  75.  return 0; 

注意

不同的CRC算法,對00H或FFH數據流的計算結果不一樣,部分算法存在校驗結果也為00H或FFH的情況(也就意味著存儲空間處于初始化狀態時:全0或全1,CRC校驗反而是正確的),在應用中需要注意避免。

本文轉載自微信公眾號「一口Linux」,可以通過以下二維碼關注。轉載本文請聯系一口Linux公眾號。

 

責任編輯:武曉燕 來源: 一口Linux
相關推薦

2020-03-26 09:18:54

高薪本質因素

2025-01-13 12:00:00

反射Java開發

2024-08-13 17:09:00

架構分庫分表開發

2020-08-04 10:56:09

進程線程協程

2020-07-16 09:02:45

aPaaS云計算aPaaS平臺

2021-01-18 13:05:52

Serverless Serverfull FaaS

2020-12-01 11:34:14

Elasticsear

2023-11-09 08:41:25

DevOpsAIOps軟件

2023-05-04 08:24:52

ChatGPT產品經理工業革命

2024-05-31 13:23:19

OceanBase單機版架構

2024-08-07 10:54:59

正則表達式Java RegexJava

2025-10-30 00:55:00

AIAgent分布式

2020-05-20 09:55:42

Git底層數據

2024-07-10 12:00:42

2025-08-28 02:15:00

CAPMySQL架構

2025-10-27 05:00:00

2020-07-16 07:30:15

數據庫SQL技術

2025-10-10 07:55:23

檢索搜索架構

2023-05-11 08:16:13

可視化監控工具Kafka

2020-01-02 09:06:23

微服務數據框架
點贊
收藏

51CTO技術棧公眾號

国产精品美女久久久久aⅴ国产馆| 9色精品在线| 欧美一级精品大片| 91视频 -- 69xx| а√天堂中文在线资源bt在线| 激情成人综合网| 2020久久国产精品| 久久久久久久久久97| 北条麻妃在线一区二区免费播放| 91福利在线观看| 国产在线观看欧美| 在线免费看a| 成人aa视频在线观看| 国产日韩精品一区二区| 精品91久久久| 欧美高清日韩| 综合国产在线观看| 成人在线电影网站| 91成人小视频| 色久综合一二码| 久久精品视频16| 操你啦视频在线| 中文字幕不卡三区| 久久综合给合久久狠狠色| 91黄色在线视频| 日日夜夜免费精品视频| 国内精品在线一区| 丝袜美腿小色网| 欧美精品一区二区久久| 日韩av中文字幕在线播放| 精品国产午夜福利在线观看| 日韩av黄色| 在线视频观看一区| 中文字幕无码精品亚洲35| 中中文字幕av在线| 自拍偷自拍亚洲精品播放| 日韩一区免费观看| 久草在线免费福利资源| 成人av免费观看| 成人免费在线一区二区三区| 国产夫妻在线观看| 国产在线不卡一卡二卡三卡四卡| 国产精品视频久久久久| 黄色片视频免费| 久久高清一区| 日本精品久久电影| 久久久国产精品成人免费| 亚洲国产国产亚洲一二三 | 国产在线看片| 成人免费视频在线观看| 国产日韩视频在线播放| 日本最黄一级片免费在线| 国产精品嫩草影院com| 天堂社区 天堂综合网 天堂资源最新版 | 欧美xxxx视频| 亚洲一区二区av在线| 人人妻人人澡人人爽欧美一区| 七七成人影院| 婷婷夜色潮精品综合在线| 日本www在线视频| 国产伦精品一区二区三区视频金莲| 懂色av一区二区三区| 国产91对白刺激露脸在线观看| 蜜桃在线视频| 欧美亚洲图片小说| 手机免费av片| 午夜久久av| 日韩成人免费视频| 美女洗澡无遮挡| 四虎成人av| 美乳少妇欧美精品| 日韩av电影网址| 老司机精品导航| 国产热re99久久6国产精品| 999av视频| 99久久精品国产导航| 青娱乐一区二区| 麻豆网站在线看| 亚洲第一搞黄网站| 日韩一级免费在线观看| 日韩一区中文| 亚洲福利视频专区| 欧美一区二区三区粗大| 国产精品videossex久久发布| 欧美中文在线视频| 一区不卡在线观看| 成人精品免费视频| 亚洲日本理论电影| 国产一线二线在线观看| 欧美在线啊v一区| 波多野结衣电影免费观看| 丝袜美腿一区二区三区动态图| 尤物九九久久国产精品的特点| 日韩女优一区二区| 首页国产欧美久久| 超碰97在线人人| 酒色婷婷桃色成人免费av网| 亚洲三级在线免费| 成人免费xxxxx在线视频| 麻豆久久一区| 亚洲图中文字幕| 国产一级做a爱免费视频| 奶水喷射视频一区| 官网99热精品| 在线免费观看的av网站| 亚洲3atv精品一区二区三区| 中文字幕天天干| 大陆精大陆国产国语精品| 色诱女教师一区二区三区| 日本少妇做爰全过程毛片| 九九国产精品视频| 欧美午夜精品理论片a级大开眼界| 1stkiss在线漫画| 欧美丝袜丝交足nylons图片| 亚洲第一黄色网址| 欧美jizzhd精品欧美巨大免费| 国产成人精品综合久久久| 亚洲成人中文字幕在线| 日韩一区中文字幕| 9久久婷婷国产综合精品性色 | 欧美不卡视频在线观看| 国产麻豆成人传媒免费观看| 亚洲精品在线免费看| 欧美××××黑人××性爽| 亚洲国产精品999| 国产亚洲第一页| 激情文学综合丁香| 亚洲国产一区二区三区在线播| 中文字幕在线看片| 亚洲娇小xxxx欧美娇小| 青青草精品在线视频| 美女视频一区二区三区| 日本不卡高清视频一区| 亚洲涩涩在线| 日韩大陆欧美高清视频区| 久久久久亚洲av成人片| 国产精品一区二区不卡| 日韩人妻精品一区二区三区| 亚洲免费看片| 日韩在线观看免费全| 一区二区视频免费观看| 欧美韩日一区二区三区| 97公开免费视频| 欧美精品一区二区久久| 国产精品亚发布| 日本激情在线观看| 欧美一区二区人人喊爽| 久草网站在线观看| 国产精品69久久久久水密桃| 日韩视频一二三| 亚洲大奶少妇| 欧美精品videossex性护士| 亚洲爱情岛论坛永久| 亚洲自拍偷拍网站| 中文字幕一区二区三区乱码不卡| 亚洲精品在线二区| 欧美日韩成人一区二区三区| 人人视频精品| 日韩视频亚洲视频| 国产熟女精品视频| 亚洲国产日韩一级| 天天插天天射天天干| 久久精品一区| 亚洲欧洲三级| 麻豆国产一区二区三区四区| 欧美黑人又粗大| 无码国产精品96久久久久| 色综合咪咪久久| 波多野结衣欲乱| 国产sm精品调教视频网站| 男女超爽视频免费播放| 国产精品视频一区二区三区四蜜臂| 国产精品99久久久久久人 | 亚洲久草在线视频| 久久久午夜精品福利内容| 久久亚洲综合| 在线观看成人免费| 思热99re视热频这里只精品| 国产精品日韩欧美| 亚洲第一图区| 亚洲欧美中文日韩在线| 国产露脸91国语对白| 亚洲一区在线观看视频| www.黄色在线| 国产91综合网| 久久精品香蕉视频| 亚洲欧洲日韩| 免费国产一区二区| 成人精品视频在线观看| 97在线视频免费观看| av大片在线看| 亚洲国产婷婷香蕉久久久久久| 影音先锋国产资源| 午夜成人免费电影| 中国美女黄色一级片| 精品国产鲁一鲁****| 欧美成人免费小视频| 免费黄色在线视频网站| 日韩一区二区三区av| youjizz在线视频| 亚洲摸摸操操av| 久久精品—区二区三区舞蹈| 国产不卡高清在线观看视频| 999精品视频在线| 亚洲久色影视| 51xx午夜影福利| 欧美日韩国产高清电影| 国产伦精品一区二区三区免费视频| 成人国产精品| 欧美一级片久久久久久久| 日本在线视频www鲁啊鲁| 日韩一区av在线| 男女污污视频在线观看| 欧美tickling挠脚心丨vk| 一级黄色片免费| 在线视频中文字幕一区二区| 五月天婷婷综合网| 一区二区三区在线不卡| www.涩涩爱| 国产午夜精品久久| 亚洲制服丝袜在线播放| 国产高清不卡一区二区| 污片在线免费看| 日韩专区在线视频| 久久精品国产精品亚洲色婷婷| 国产专区一区| 久久亚洲a v| 欧美日韩亚洲三区| 99中文字幕在线观看| 久久久五月天| 亚洲人久久久| 国产精品久久久久9999赢消| 亚洲 国产 日韩 综合一区| 国产精品欧美在线观看| 欧美性bbwbbwbbwhd| 偷拍自拍亚洲色图| 欧美h视频在线| 要久久爱电视剧全集完整观看| 国产欧美韩日| 麻豆精品av| 精品午夜一区二区| 亚州精品视频| 欧美亚洲国产免费| 欧美精选一区二区三区| 亚洲电影免费| 婷婷丁香综合| 法国空姐在线观看免费| 欧美成人一区二免费视频软件| 2021国产视频| 亚洲国产激情| 日本精品一区在线观看| 久久久久久久高潮| 五月婷婷丁香综合网| 久久99精品国产麻豆婷婷洗澡| 国产永久免费网站| 国产精品中文欧美| www.美色吧.com| 91丝袜美腿高跟国产极品老师 | 精品按摩偷拍| 欧美精品一区二区三区在线看午夜 | 国产手机视频精品| 成人18在线| 久久伊人精品天天| 亚洲制服国产| 456国产精品| www.久久.com| 亚洲影院在线看| 秋霞综合在线视频| 亚洲成人自拍视频| 国产在线不卡| 亚洲人成无码www久久久| 久久er99精品| 日本人妻一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 一级特黄曰皮片视频| 亚洲欧美日韩在线| 男人的天堂一区二区| 欧美亚洲动漫精品| 超碰福利在线观看| 亚洲女同性videos| 免费在线视频欧美| 97香蕉久久夜色精品国产| 免费观看成人性生生活片 | 国产精品久久久久9999小说| 国内精品免费**视频| 欧美成人三级伦在线观看| 日本一区二区三级电影在线观看 | 蜜桃精品成人影片| 中文字幕在线不卡国产视频| 国产乡下妇女做爰| 欧美四级电影在线观看| 性一交一乱一乱一视频| 国产亚洲一区精品| 91超碰在线播放| 成人福利视频在线观看| 欧美日韩看看2015永久免费| 亚洲一区三区视频在线观看| 亚洲综合好骚| 欧洲熟妇的性久久久久久| 中文乱码免费一区二区| 国产精品成人国产乱| 69久久夜色精品国产69蝌蚪网| 神马精品久久| 欧美激情在线有限公司| 成人短视频软件网站大全app| 欧美在线3区| 国产精品久久久久久久免费软件 | 九色视频网站在线观看| 色与欲影视天天看综合网| 91看片一区| 欧美精品久久| 一区二区黄色| 91亚洲一线产区二线产区| 中文字幕日韩精品一区| 无码任你躁久久久久久久| 亚洲精品国产品国语在线| 性欧美videos高清hd4k| 91精品视频专区| 欧美精品一区二区久久| 久久9精品区-无套内射无码| 成人sese在线| 国产一级av毛片| 日韩一本二本av| 超鹏97在线| 亚洲aaa激情| 91精品啪在线观看国产18| 欧美三级午夜理伦三级富婆| 久久久久久**毛片大全| www欧美在线| 日韩精品久久久久久福利| av有码在线观看| 国产精品一区二区a| 亚洲黄色大片| 欧美夫妇交换xxx| 婷婷久久综合九色综合绿巨人| 亚洲免费国产视频| 久久久久久国产免费| 成人性生交大片免费看96| 久久人人爽人人爽人人av| 成人精品免费视频| 日韩伦人妻无码| 日韩精品免费综合视频在线播放 | 色综合一区二区三区| 头脑特工队2在线播放| 日本成人免费在线| 国产一区二区三区天码| 国产又黄又猛又粗又爽的视频| 欧美激情在线免费观看| 亚洲一区在线观| 美女黄色丝袜一区| 久久97精品| 成年人观看网站| 中文字幕乱码一区二区免费| 中文字幕一区二区在线视频| 久久精品久久久久久| 亚洲日本va午夜在线电影| 久久久久久www| 久久久亚洲欧洲日产国码αv| 日韩黄色片网站| 日韩性xxxx爱| 超碰一区二区三区| 欧美视频免费播放| 中文字幕一区三区| 韩国av电影在线观看| 日本成人精品在线| 婷婷伊人综合| 人妻激情偷乱频一区二区三区| 欧美日韩国产综合视频在线观看中文 | 国产一级片免费| 亚洲欧美精品一区二区| 国产精品麻豆成人av电影艾秋| 麻豆md0077饥渴少妇| proumb性欧美在线观看| chinese国产精品| 在线播放精品一区二区三区 | 天天操天天干视频| 一道本无吗dⅴd在线播放一区 | 91精品国模一区二区三区| av中文资源在线资源免费观看| 日韩av一区二区三区在线观看| 国产精品18久久久| 国产精品乱码一区二区视频| 欧美www在线| 国产精品手机在线播放 | 一二三四视频社区在线| 中文字幕av在线一区二区三区| 亚洲福利在线观看视频| 日韩美女在线观看| 欧美日韩国产免费观看| 精品欧美一区二区久久久| 欧美成人bangbros| 亚洲精品555| 国产成人无码精品久久久性色| 国产精品萝li| 外国精品视频在线观看| 99伊人久久| 精品一区二区在线播放| 91在线看视频| 九九久久国产精品| 色综合久久网|