使用C#配合modbus协议的16进制代码生成crc16校验码的计算方法

发布时间 2023-08-09 16:40:28作者: 山中修炼十余载

前言

在网上也是查看了很多关于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);