Concox跟踪器的16位CRC-ITU计算

我正在为服务器程序创建C#代码,该程序通过TCP从Concox TR06 GPS跟踪器接收数据:

http://www.iconcox.com/uploads/soft/140920/1-140920023130.pdf

首次启动时,跟踪器会发送一条登录消息,需要在发送任何位置数据之前进行确认。 我的第一个问题是,根据文档,确认消息长18个字节,但它们提供的示例只有10个字节长:

在此处输入图像描述

在上表中的Ps,我非常确定的“位”列应该标记为“字节”而不是……

现在,我的主要问题是计算错误检查。 根据文件:

校验码由CRC-ITU检查方法生成。 从分组长度到信息序列号(包括“分组长度”和“信息序列号”)的协议结构中的数据的校验码是CRC-ITU的值。

好的,所以在上面的例子中,我需要在0x05 0x01 0x00 0x01上计算CRC

现在,我猜测它是16位CRC,如上图所示,CRC长度为2个字节。 我已经在http://www.sanity-free.org/134/standard_crc_16_in_csharp.html和http://www.sanity-free.org/133/crc_16_ccitt_in_csharp.html上实现了我在网上找到的两种不同的CRC实现,但都没有给出我的答案是,根据上图我应该得到 – 0xD9 0xDC。 我甚至使用这个网站 – https://www.lammertbies.nl/comm/info/crc-calculation.html – 手动输入4个字节,但没有任何东西给我我应该得到的结果根据上图…

我可能会出错的任何想法? 任何指针/提示将不胜感激。 谢谢

ITU CRC-16也称为X-25 CRC。 你可以在这里找到它的规格,即:

width=16 poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff check=0x906e name="X-25" 

我的crcany代码将采用该规范并生成C代码来计算CRC。

这是由此生成的逐位(慢)代码:

 #include  unsigned crc16x_25_bit(unsigned crc, void const *data, size_t len) { if (data == NULL) return 0; crc = ~crc; crc &= 0xffff; while (len--) { crc ^= *(unsigned char const *)data++; for (unsigned k = 0; k < 8; k++) crc = crc & 1 ? (crc >> 1) ^ 0x8408 : crc >> 1; } crc ^= 0xffff; return crc; }