文件的 CRC 检查

Posted

技术标签:

【中文标题】文件的 CRC 检查【英文标题】:CRC checks for files 【发布时间】:2010-09-19 16:50:45 【问题描述】:

我正在使用一个小型 FAT16 文件系统,我想为存储配置信息的单个 XML 文件生成 CRC 值。如果数据发生更改或损坏,我希望能够检查 CRC 以确定文件仍处于原始状态。

问题是,如何在不改变文件本身的CRC值的情况下,将CRC值放入文件中?我可以想到几个解决方案,但我认为这个问题必须有一个相当标准的解决方案。

【问题讨论】:

【参考方案1】:

在通信协议中广泛使用的常见解决方案是将 CRC 字段设置为 0,计算 CRC,然后将其替换为 0。校验码应该执行相反的过程 - 读取 CRC,将字段置零,计算CRC并进行比较。

另外,对于文件校验和,我强烈推荐使用 MD5 而不是 CRC。

【讨论】:

【参考方案2】:

我不会将 CRC 存储在文件本身中。我将有一个您的程序使用的文件(我将使用 XML 格式),其中包含文件名列表及其关联的 CRC 值。没必要把它弄得那么复杂。

【讨论】:

【参考方案3】:

一个常见的解决方案是只使用不同的文件。每个文件旁边只有一个文件名相同但扩展名不同的文件。例如:foobar.txt 和 foobar.txt.md5(或 .crc)。

【讨论】:

【参考方案4】:

一种解决方案是使用 dsofile.dll 将扩展属性添加到您的文件中。您可以将 CRC 值(转换为字符串)保存为扩展文件属性。这样你就不会改变文件的结构。

dsofile.dll 是一个 ActiveX dll,因此可以从各种语言中调用它,但是它限制了您在 Windows 上运行。以下是关于 dsofile.dll 的更多信息:http://support.microsoft.com/kb/224351

【讨论】:

我相信 dsofile.dll 仅适用于“结构化存储”文件。【参考方案5】:

没有办法做到这一点。您可以使文件的前 x 个字节(CRC 使用 32 位整数,因此 4 个字节)包含 CRC,然后在计算 CRC 时,您只能考虑最初 4 个字节之后的字节。

另一种解决方案是将 CRC 包含在文件名中。所以 MyFile.Config 最终会成为 MyFile.CRC1234567.Config。

【讨论】:

【参考方案6】:

定义一个标头,生成除标头之外的所有内容的 CRC,然后将值放入标头中。

【讨论】:

【参考方案7】:

您可以将 CRC 值附加到文件的末尾。然后,稍后在计算CRC值进行校验时,省略最后四个字节。

【讨论】:

以上是关于文件的 CRC 检查的主要内容,如果未能解决你的问题,请参考以下文章

使用 arduino IDE 从 esp8266 nodeMCU 中的服务器下载文件时是不是需要 CRC 检查?

将 CRC 值保存在文件中,而不更改实际的 CRC 校验和?

CRC32(C) 可以返回 0 吗?

Golang-常用校验算法

文件的检查和以及字节数

cksum可以判断文件是不是一致吗?