【发布时间】:2018-07-09 08:09:12
【问题描述】:
假设我有一个 1024kb 的数据,它被 1kB 缓冲并从发送器到接收器传输了 1024 次。
最后一个缓冲区包含计算出的 CRC32 值作为最后 4 个字节。
但是,由于 RAM 的限制,接收器必须逐个缓冲区计算 CRC32 缓冲区。
我想知道如何应用 CRC32 计算的线性分布式加法来匹配总 CRC32 值。
我查看了 CRC 计算及其分配偏好。计算及其线性度实现起来不是很清楚。
那么,是否有一个数学表达式可以将计算出的 CRC32 与缓冲区相加,以匹配通过总计算得出的 CRC32 结果?
如:
int CRC32Total = 0;
int CRC32[1024];
for(int i = 0; i < 1024; i++){
CRC32Total = CRC32Total + CRC32[i];
}
亲切的问候
【问题讨论】:
-
你为什么不继续计算CRC32而不为每个块重置它?这是实现您想要的最简单的方法。要按照您建议的方式进行操作,您将需要为零块预先计算大量 CRC32,以便您可以在最后将它们组合起来......这确实是没有任何收获的大量努力。
-
先生,我是接收方。我只能有一个缓冲区大小(1kB)的数据。然后我将缓冲区刷新到内部存储器中,等待下一个 TFTP 包到达以恢复缓冲区。因此,我必须在每次恢复缓冲区时收集 CRC32 值(因为由于 RAM,我无法收集缓冲区的所有数据)并将单个 CRC32 值相互组合(添加)直到最后 4 个字节的总 CRC32数据到达,进行匹配。 “在不重置每个块的情况下计算 CRC32”到底是什么意思?
-
要计算 CRC32,您需要使用预定义的值(通常为 0xFFFFFFFF)加载“种子”,然后将块中的每个字节提供给 CRC32 算法。当块结束时,您将获得该块的 CRC32。如果您对每个块重复此过程,则您正在“重置”CRC32 引擎。现在,如果您使用从一个块计算的 CRC32 作为下一个块的“种子”,那么您将“继续”计算 CRC32。如果您对所有块都遵循此过程,最后您将获得总 CRC32!
-
先生,我希望您使用数学运算术语(add、mul、shift 等)或固件描述术语(缓冲区、包等)而不是“feed、load 和 seed” “?你能解释更多吗? (例如,使用独占或使用 0xFFFFFFFF 操作第一个缓冲区,使用第一个缓冲区操作第二个缓冲区等等..)感谢您的快速响应和深入了解的答案,但我不能说我和您一样先进,先生,了解您在全栈术语方面的经验。
-
我说得对吗:您正在刷新未经验证的数据?请告诉我们这不是代码-Flash,而是一些备份-Flash..
标签: embedded crc crc32 distributive