首页 > 解决方案 > 即时计算CRC,可能与否

问题描述

是否可以动态计算 CRC(在流中)?

例如,我有 1 GB 的数据,我想减少未检测到错误的可能性。我想在整个文件上实现一些东西(CRC或哈希),(我已经为每个包含一些数据包的块实现了CRC),

当我们在整个文件上放置一个 CRC 时,是否可以在我们收到第一个数据包后立即开始计算 CRC,或者我们是否必须等待整个文件被接收然后开始计算 CRC?

标签: hashcrccrc32

解决方案


是的。CRC 和我所知道的每个散列都是可流式传输的。它们有一个小的、有限的状态,随着数据通过它们而更新。对于 CRC,状态就是 CRC 本身。

zlib 中的 CRC 采用以下形式:

unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned len);

buf为时NULL,返回初始 CRC。所以它是这样使用的:

unsigned long crc = crc32(0, NULL, 0);    // initial CRC
for (...) {                               // some sort of loop
    ...                                   // generating a chunk of data
    crc = crc32(crc, buf, len);           // update the CRC with the data
    ...                                   // this all gets repeated many times
}
...                                       // loop is done, crc has the CRC

推荐阅读