数据包CRC计算方法

Packet CRC Computation Approach

本文关键字:方法 计算 CRC 数据包      更新时间:2023-10-16

我正在编写一个正在读取传入串行数据包的类。 数据包用标头、一些数据进行布局,后跟一个双字节 CRC。

我还编写了一个类,我可以在其中构建要发送的数据包。 此类具有 GenerateCRC(( 方法,该方法允许调用方计算他们通过调用其他方法构建的数据包的 CRC。 GenerateCRC(( 调用仅在正确设置数据包标头和数据后调用。 因此,此方法在 for 循环中迭代数据包,并以这种方式计算 CRC。

现在我正在编写代码以读取数据包,我需要通过计算 CRC 来验证它们。 我正在尝试尽可能多地重用以前的"构建器"类,因为当我在数据包中读取时,我想将其存储在内存中,最好的方法是使用"builder"类。 但是,我在计算CRC时遇到了障碍。

我正在考虑两种主要方法,我在权衡利弊和决定一种方法时遇到了麻烦。 以下是我的两个选择:

  1. 计算我在字节中读取的 CRC。 我正在读取的数据被推送到队列中,因此我一次弹出一个字节。 我会保持一个正在运行的"总"CRC,并在读入最后一个数据字节后立即完成计算。

  2. 仅在我读取完整数据包后计算CRC。 在这种情况下,我不必保留运行总计,但我必须再次迭代数据包。 我应该注意,这将允许我重用我以前编写的代码。

目前,我倾向于选项 1,并将"构建器"和"阅读器"之间的任何常见功能移动到单独的头文件中。 但是,我想确保第一个选项在性能方面实际上是更好的选项,因为它确实使我的代码更加混乱。

提前感谢您的帮助。

我会选择门#2。 这允许通过在两端使用相同的代码来更简单地验证代码,并且还允许使用更快的CRC算法一次处理四个或八个字节。