我是通信编程的新手。基本上,我需要获得CRC输出的十六进制等效值。我有一个十六进制字符串,它是参数 -
EE0000000015202020202020202020202020323134373030353935
这是两个字符串的串联。我需要的输出是E6EB
中的hex
或59115
中的ushort
。我根据我在网络上发现的内容尝试了不同的方法,但无济于事。我应该使用的多项式为0x8408
,即[CRC-16-CCITT][1]
,http://en.wikipedia.org/wiki/Polynomial_representations_of_cyclic_redundancy_checks。
我尝试了这种方法CRC_CCITT Kermit 16 in C#,但输出不正确。我也尝试了按位~
运算符作为反向计算的建议,但仍然失败。
非常感谢任何帮助。
答案 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
。