文件的 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 检查?