c# 计算 CRC16 高位
时间: 2024-02-15 12:59:25 浏览: 32
```c#
public static ushort CalculateCRC16(byte[] data)
{
ushort crc = 0xFFFF;
for (int i = 0; i < data.Length; i++)
{
crc = (ushort)(crc ^ (data[i] << 8));
for (int j = 0; j < 8; j++)
{
if ((crc & 0x8000) != 0)
{
crc = (ushort)((crc << 1) ^ 0x1021);
}
else
{
crc <<= 1;
}
}
}
return crc;
}
```
相关问题
c# 计算 CRC16
以下是使用C#计算CRC16的示例代码:
```csharp
public static ushort CalculateCRC16(byte[] data)
{
ushort crc = 0xFFFF;
ushort polynomial = 0x1021;
for (int i = 0; i < data.Length; i++)
{
crc ^= (ushort)(data[i] << 8);
for (int j = 0; j < 8; j++)
{
if ((crc & 0x8000) != 0)
{
crc = (ushort)((crc << 1) ^ polynomial);
}
else
{
crc <<= 1;
}
}
}
return crc;
}
```
你可以将要计算CRC16的字节数组传入`CalculateCRC16`方法,它将返回一个`ushort`类型的CRC16校验值。
C# Modbus CRC16
以下是使用C#计算Modbus CRC16的示例代码:
```csharp
public static ushort CalculateCrc(byte[] data)
{
ushort crc = 0xFFFF;
for (int i = 0; i < data.Length; i++)
{
crc ^= (ushort)data[i];
for (int j = 0; j < 8; j++)
{
if ((crc & 0x0001) == 0x0001)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return crc;
}
```
使用示例:
```csharp
byte[] data = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01 };
ushort crc = CalculateCrc(data);
byte[] crcBytes = BitConverter.GetBytes(crc);
Array.Reverse(crcBytes);
byte[] packet = new byte[data.Length + 2];
Array.Copy(data, packet, data.Length);
Array.Copy(crcBytes, 0, packet, data.Length, 2);
```
在这个示例中,我们使用CalculateCrc方法计算数据的CRC16值,并将其附加到数据包的末尾。请注意,由于Modbus使用大端字节顺序,因此我们需要使用Array.Reverse方法来反转CRC字节数组的顺序。