如何计算以下TCP / IP协议的CRC校验和

时间:2017-04-27 08:39:35

标签: c python-3.x sockets networking network-programming

enter image description here

以下是规范。

我使用python3使用简单的协议与TCP / IP服务器通信,如图所示。

我想知道如何在这里计算CRC校验和?如命令包规范中所示,它需要为1个字节。

2 个答案:

答案 0 :(得分:2)

我在Python 3中假设,如果你有以字节为单位的数据包,即说packet = bytes(0xF0, 0xF0, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0xF0),那么校验和将只是这些字节总和的1的补码的最低有效字节,即{{1} }。

因此,如果您有一个有效负载(0 - sum(packet)) & 0xFF,这将是使其成为完整数据包的代码:

payload

答案 1 :(得分:0)

假设此thing是目标。它们可能意味着您应该将所有字节加在一起,但将结果存储在8位变量中(C中为uint8_t)。这意味着这个变量会多次溢出,数据的最低有效字节就是校验和。

在20世纪70年代经常使用类似的技术,但是它们经常将得到的LS字节反转为一个补码或二进制补码。 (例如,摩托罗拉S-record和Intel Hex链接器格式如何获得校验和。)

请注意:

  • 这不是CRC。 CRC =循环冗余校验,一种完全不同类型的算法的名称,可用于计算校验和。制作手册/协议的人不称职。
  • 基于8位加法的校验和是业余解决方案。它大多只是作为浪费空间而坐在那里,因为即使是简单的单个位错误的概率也是可笑的,基本上是50/50。这就是20世纪60年代人们对此并不了解的数据协议。如果您想要任何形式的数据完整性,那就不会这样做。
  • RS-232一般是业余解决方案,几乎没有比原始UART / TTL水平更好。这种20世纪60年代的技术依然存在,因为PC支持它已有一段时间了。他们不再使用USB了。至于工业应用,他们使用RS-422 / RS-485或更好的CAN。

因此,该产品不适用于任何工业自动化设备"。它不应该在工业环境中使用。