我正在使用一个小型 FAT16 文件系统,我想为存储配置信息的单个 XML 文件生成 CRC 值。如果数据更改或损坏,我希望能够检查 CRC 以确定文件仍处于原始状态。
问题是,如何在不改变文件本身的 CRC 值的情况下,将 CRC 值放入文件中?我可以想到几个解决方案,但我认为这个问题必须有一个相当标准的解决方案。
我正在使用一个小型 FAT16 文件系统,我想为存储配置信息的单个 XML 文件生成 CRC 值。如果数据更改或损坏,我希望能够检查 CRC 以确定文件仍处于原始状态。
问题是,如何在不改变文件本身的 CRC 值的情况下,将 CRC 值放入文件中?我可以想到几个解决方案,但我认为这个问题必须有一个相当标准的解决方案。
您可以将 CRC 值附加到文件的末尾。然后,在稍后计算 CRC 值进行校验时,省略最后四个字节。
定义一个标头,生成除标头之外的所有内容的 CRC,然后将值放入标头中。
一个常见的解决方案是只使用不同的文件。每个文件旁边只有一个文件名相同但扩展名不同的文件。例如:foobar.txt 和 foobar.txt.md5(或 .crc)。
通信协议中广泛使用的常见解决方案是将 CRC 字段设置为 0,计算 CRC,然后将其替换为 0。校验码应该做相反的过程 - 读取 CRC,将字段归零,计算CRC 和比较。
此外,对于文件校验和,我强烈推荐 MD5 而不是 CRC。
一种解决方案是使用 dsofile.dll 将扩展属性添加到您的文件中。您可以将 CRC 值(转换为字符串)保存为扩展文件属性。这样你就不会改变文件的结构。
dsofile.dll 是一个 ActiveX dll,因此可以从各种语言中调用它,但是它限制了您在 Windows 上运行。以下是有关 dsofile.dll 的更多信息:http: //support.microsoft.com/kb/224351
我不会将 CRC 存储在文件本身中。我将有一个您的程序使用的文件(我将使用 XML 格式),其中包含文件名列表及其关联的 CRC 值。没必要把它弄得那么复杂。
没有办法做到这一点。您可以使文件的前 x 个字节(CRC 使用 32 位整数,因此 4 个字节)包含 CRC,然后在计算您的 CRC 时,您只能考虑最初 4 个字节之后的字节。
另一种解决方案是将 CRC 包含在文件名中。所以 MyFile.Config 最终会成为 MyFile.CRC1234567.Config。