private void button1_Click(object sender, EventArgs e)
{
string hex = textBox1.Text.Trim();
if (hex.Length > 1)
{
byte [] inputByteArray = new byte[hex.Length / 2];
for (var x = 0; x < inputByteArray.Length; x++)
{
string s = hex.Substring(x * 2, 2);
uint s4 = Convert.ToUInt32(s, 16);
inputByteArray[x] = Convert.ToByte((int)s4);
}
string x1=crc16_modbus(inputByteArray, inputByteArray.Length);
textBox2.Text = x1.ToString();
}
}
public string crc16_modbus(byte[] modbusdata, int Length)
{
uint i, j;
uint crc16 = 0xFFFF;
for (i = 0; i < Length; i++)
{
crc16 ^= modbusdata[i]; //CRC=BYTE xor CRC
for (j = 0; j < 8; j++)
{
if ((crc16 & 0x01) == 1) //如果CRC最后一位是1,右移动一位后carry=1,则将CRC右移动一位后,再与POLY16=0xA001进行xor运算
{
crc16 = (crc16 >> 1) ^ 0xA001;
}
else
{
crc16 = crc16 >> 1;//如果CRC最后一位为0,则只将CRC右移一位
}
}
}
string crc16_1 = string.Format("{0:X}", crc16);
if (crc16_1.Length % 2 > 0)
{
crc16_1 = "0" + crc16_1;//如果高位隐藏0,则补充
}
crc16_1 = crc16_1.Substring(2, 2) + crc16_1.Substring(0, 2);//交换前后字节
return crc16_1;
}