public static byte[] ToModbus(byte[] byteData)
{
byte[] CRC = new byte[2];
UInt16 wCrc = 0xFFFF;
for (int i = 0; i < byteData.Length; i++)
{
wCrc ^= Convert.ToUInt16(byteData[i]);
for (int j = 0; j < 8; j++)
{
if ((wCrc & 0x0001) == 1)
{
wCrc >>= 1;
wCrc ^= 0xA001;//异或多项式
}
else
{
wCrc >>= 1;
}
}
}
CRC[1] = (byte)((wCrc & 0xFF00) >> 8);//高位在后
CRC[0] = (byte)(wCrc & 0x00FF); //低位在前
return CRC;
}
测试.
byte[] k = new byte[] { 0x01, 0x03, 0x00, 0x01, 0x00, 0x02 };
byte[] t = ToModbus(k);
string str = "";
for (int i = 0; i < t.Length; i++)
{
str+=t[i].ToString("X");//10->16
}
//-->95CB