前言
在网上也是查看了很多关于crc16校验的文章,但是好像都是对于有基础的人看的,我当时拿起直接使用,发现行不通,这对于零基础的不是很友好,所以决定贡献一篇,哈哈哈哈~~~
public uint CalcCRC16(string hexCommand) { byte[] pBuf = HexStringToByteArray(hexCommand); uint i, j; uint crc16 = 0xFFFF; for (i = 0;i< pBuf.Length; i++) { crc16 ^= pBuf[i]; for (j = 0;j<8; j++) { if ((crc16 & 0x0001) != 0) { crc16 >>= 1; // 右移一位 crc16 ^= 0xA001; // 异或多项式0xA001 } else { crc16 >>= 1; // 右移一位 } } } return crc16; } private byte[] HexStringToByteArray(string hexString) { hexString = hexString.Replace(" ", "").Replace("-", "").ToUpper().Trim(); if (hexString.Length % 2 != 0) { hexString += " "; } int bytesCount = hexString.Length / 2; byte[] bytes = new byte[bytesCount]; for (int i = 0; i < bytesCount; i++) { string byteString = hexString.Substring(i * 2, 2); bytes[i] = Convert.ToByte(byteString, 16); } return bytes; }
下面就是使用环节:
string defSend = "0125546ACDF126"; //modbus是我将CalcCRC16这个方法封装在modbus这个对象的类中 uint crcDef = modbus.CalcCRC16(defSend); //Low表示低位字节 High表示高位字节 //crcDefLow 和crcDefHigh 算出来的就是校验码 string crcDefLow = Convert.ToString((byte)(crcDef & 0xFF), 16); string crcDefHigh = Convert.ToString((byte)(crcDef >> 8), 16);
标签:代码生成,string,crc16,16,hexString,modbus,byte From: https://www.cnblogs.com/ting1024/p/17617203.html