【发布时间】:2011-09-23 10:12:41
【问题描述】:
我使用这个简单的函数来计算给定文件的 CRC 校验和:
long i, j = 0;
int k = 0;
uint crc = 0xFFFFFFFF;
FileInfo file_info = new FileInfo(file);
byte[] file_buffer = new byte[32768];
FileStream file_stream = new FileStream(@file, FileMode.Open);
while ((i = file_stream.Read(file_buffer, 0, file_buffer.Count())) > 0)
{
for (j = 0; j < i; j++)
{
uint before = crc;
k = (int)((crc ^ file_buffer[j]) & 0x000000FFL);
uint after = (uint)((crc >> 8) & 0x00FFFFFFL) ^ crc32_table[k];
crc = after;
uint test = (uint)((crc << 8) & 0x00FFFFFFL) ^ crc32_table[k];
MessageBox.Show((~crc).ToString("X"));
}
}
file_stream.Close();
return ~crc;
我的问题是:假设我有一个大文件,比如说 100MB。前 50MB 和后 50MB 的 CRC-32 计算与 100MB 文件的 CRC-32 计算之间是否存在联系?
我问的原因是,我有一些非常大的文件(大约 10GB 给或取)需要一些时间来生成,但是在生成它们时,大部分部分保持静态,但是,中间部分(已知点)和开始处(标题,也称为部分/长度)。计算 10GB 文件的 CRC-32 校验和需要相当长的时间,所以我想知道是否有任何方法可以分块进行?
【问题讨论】:
-
是的,有可能。只要试着理解代码,你就会明白为什么。
-
谢谢。你介意详细说明一下吗?我尝试将以前的 crc 值用作:private uint crc(string file, uint previous_value = 0xFFFFFFFF),但我得到了这些结果:
a: 158094AD b: 68CD9474 ab: CD530E90 b2: 42A6F4F3,其中 b2 是 crc,其基值为 a 的 crcvalue。对不起!我的错。我不小心使用了 crc,而不是否定它 (~crc)。作品。非常感谢,leppie :) -
酷!很高兴帮助您“看到”答案:)
-
您能否发表您的最后一条评论作为答案并接受它?这样问题就不再显示为未回答。
-
@Mik 提交您修改后的代码并接受它作为答案。