ANSI CRC16校驗算法的C#實現


首先,簡述一下CRC16校驗字節的生成步驟如下:

1) CRC16 校驗寄存器賦值為0xFFFF;
2) 取被校驗串的第一個字節賦值給臨時寄存器;
3) 臨時寄存器與CRC16 校驗寄存器的高位字節進行“異或”運算,賦值給CRC16 校驗寄存器;
4) 取CRC16 校驗寄存器最后一位賦值給檢測寄存器;
5) 把CRC16 校驗寄存器右移一位;
6) 若檢測寄存器值為1,CRC16 校驗寄存器與多項式0xA001 進行“異或”運算,賦值給CRC16
校驗寄存器;
7) 重復步驟4~6,直至移出8 位;
8) 取被校驗串的下一個字節賦值給臨時寄存器;
9) 重復步驟3~8,直至被校驗串的所有字節均被校驗;
10) 返回CRC16 校驗寄存器的值。
校驗碼按照先高字節后低字節的順序存放。

CRC 校驗算法(C語言)示例:

 1 /****************************************************************************************
 2 函 數: CRC16_Checkout
 3 描 述: CRC16 循環冗余校驗算法。
 4 參 數 一: *puchMsg:需要校驗的字符串指針
 5 參 數 二: usDataLen:要校驗的字符串長度
 6 返 回 值: 返回CRC16 校驗碼
 7 ****************************************************************************************/
 8 unsigned int CRC16_Checkout ( unsigned char *puchMsg, unsigned int usDataLen )
 9 {
10     unsigned int i,j,crc_reg,check;
11     crc_reg = 0xFFFF;
12     for(i=0;i<usDataLen;i++)
13     {
14         crc_reg = (crc_reg>>8) ^ puchMsg[i];
15         for(j=0;j<8;j++)
16         {
17             check = crc_reg & 0x0001;
18             crc_reg >>= 1;
19             if(check==0x0001)
20             {
21                 crc_reg ^= 0xA001;
22             }
23         }
24     }
25     return crc_reg;
26 }

示例:
##0101QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5;CP=&&RtdInterval=30&&1C80\r\n,其中1C08 為CRC16 校驗碼,是對數據段QN=20160801085857223;ST=32;CN=1062;PW=100000;MN=010000A8900016F000169DC0;Flag=5;CP=&&RtdInterval=30&& 進行CRC16 校驗所得的校驗碼。

 

C#源代碼:

 1 public static string CRC16(byte[] data)
 2 {
 3     ushort crc = 0xFFFF;
 4     int len = data.Length;
 5     for (int i = 0; i < len; i++)
 6     {
 7         crc = (ushort)((crc >> 8) ^ data[i]);
 8         for (int j = 0; j < 8; j++)
 9             crc = (crc & 1) == 1 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
10     }
11     return string.Format("{0:X}", crc).PadLeft(4, '0');
12 }

 調用示例:

1 string data = "QN=20200618135900000;ST=22;CN=2051;PW=123456;MN=XXXX0HZ0006018;CP=&&DataTime=20200618135900;a34001-Avg=0.106,a34001-Max=0.106,a34001-Min=0.106,a34001-Flag=N;a01001-Avg=57.8,a01001-Max=57.8,a01001-Min=57.8,a01001-Flag=N;a01002-Avg=49.4,a01002-Max=49.4,a01002-Min=49.4,a01002-Flag=N;a01006-Avg=100.12,a01006-Max=100.12,a01006-Min=100.12,a01006-Flag=N;a01007-Avg=1.3,a01007-Max=1.3,a01007-Min=1.3,a01007-Flag=N;a01008-Avg=82.0,a01008-Max=82.0,a01008-Min=82.0,a01008-Flag=N;a01001-Avg=142.6,a01001-Max=142.6,a01001-Min=142.6,a01001-Flag=N;&&";
2 string crc = CRC16(System.Text.Encoding.UTF8.GetBytes(data));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM