0

我是通信编程的新手。基本上,我需要得到 CRC 输出的十六进制等效值。我有一个十六进制字符串,它是参数 -

EE0000000015202020202020202020202020323134373030353935

这是两个字符串的连接。我需要的输出是E6EBinhex59115in ushort。我根据在网上找到的内容尝试了不同的方法,但无济于事。我应该使用的多项式0x8408http://en.wikipedia.org/wiki/Polynomial_representations_of_cyclic_redundancy_checks[CRC-16-CCITT][1]

我尝试了这种方法,CRC_CCITT Kermit 16 in C#,但输出不正确。我还尝试了~一些建议的按位运算符进行反向计算,但仍然失败。

很感谢任何形式的帮助。

4

2 回答 2

1

RevEng报告:

% ./reveng -s -w 16 EE0000000015202020202020202020202020323134373030353935e6eb
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

所以有你的CRC。注意CRC是反映的,反映在0x8408哪里0x1021

于 2015-05-28T16:45:36.433 回答
1

我找到了一个解决方案,我会发布它们以防有人遇到同样的问题。

private ushort CCITT_CRC16(string strInput)
{
        ushort data;
        ushort crc = 0xFFFF;
        byte[] bytes = GetBytesFromHexString(strInput);
        for (int j = 0; j < bytes.Length; j++)
        {
            crc = (ushort)(crc ^ bytes[j]);
            for (int i = 0; i < 8; i++)
            {
                if ((crc & 0x0001) == 1)
                    crc = (ushort)((crc >> 1) ^ 0x8408);
                else
                    crc >>= 1;
            }
        }
        crc = (ushort)~crc;
        data = crc;
        crc = (ushort)((crc << 8) ^ (data >> 8 & 0xFF));
        return crc;
}

private 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)
            {
                throw ex;
            }
        }
        return bytArOutput;
}

为 SoapHexBinary 导入 System.Runtime.Remoting.Metadata.W3cXsd2001。

于 2015-06-04T08:08:26.527 回答