C#CRC-16-CCITT 0x8408多项式。需要帮助

时间:2015-05-28 02:28:23

标签: crc16

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

EE0000000015202020202020202020202020323134373030353935

这是两个字符串的串联。我需要的输出是E6EB中的hex59115中的ushort。我根据我在网络上发现的内容尝试了不同的方法,但无济于事。我应该使用的多项式为0x8408,即[CRC-16-CCITT][1]http://en.wikipedia.org/wiki/Polynomial_representations_of_cyclic_redundancy_checks

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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;
}

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。

答案 1 :(得分:0)

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