Я пытаюсь сгенерировать CRC-16 с помощью С#. Аппаратное обеспечение, которое я использую для RS232, требует, чтобы входная строка была HEX. На приведенном ниже снимке экрана показано правильное преобразование. Для теста мне нужно, чтобы 8000 было равно 0xC061, однако метод C#, который генерирует CRC-16, должен иметь возможность преобразовывать любую данную HEX-строку.
Я пытался использовать Nito.KitchenSink.CRC
Я также пробовал ниже, который генерирует 8009 при вводе 8000 -
public string CalcCRC16(string strInput)
{
ushort crc = 0x0000;
byte[] data = GetBytesFromHexString(strInput);
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) ^ 0x8005);
else
crc <<= 1;
}
}
return crc.ToString("X4");
}
public Byte[] GetBytesFromHexString(string strInput)
{
Byte[] bytArOutput = new Byte[] { };
if (!string.IsNullOrEmpty(strInput) && strInput.Length % 2 == 0)
{
SoapHexBinary hexBinary = null;
try
{
hexBinary = SoapHexBinary.Parse(strInput);
if (hexBinary != null)
{
bytArOutput = hexBinary.Value;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
return bytArOutput;
}