Cómo generar un CRC-16 desde C #

Estoy tratando de generar un CRC-16 usando C #. El hardware que estoy usando para RS232 requiere que la cadena de entrada sea HEX. La captura de pantalla siguiente muestra la conversión correcta. Para una prueba, necesito que 8000 sea 0xC061, sin embargo, el método C # que genera CRC-16 debe poder convertir cualquier cadena HEX dada.

He intentado usar Nito.KitchenSink.CRC

También probé lo siguiente que genera 8009 cuando se ingresa 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;
    }

Respuestas a la pregunta(2)

Su respuesta a la pregunta