问题描述
是否可以即时(在流中)计算CRC?
例如,我有1 GB的数据,我想减少未被发现的错误的可能性。 我想在整个文件中实现一些内容(CRC或哈希), (我已经为每个块(其中包含一些数据包)实现了CRC),
当我们将CRC放在整个文件上时,是否有可能在拥有第一个数据包后立即开始计算CRC,还是必须等待接收到整个文件然后开始计算CRC? / p>
解决方法
是的。 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