Проверки CRC для файлов

Я работаю с небольшой файловой системой FAT16, и я хочу генерировать значения CRC для indidual XML-файлов, которые хранят информацию о конфигурации. В случае изменения или повреждения данных я хочу иметь возможность проверить CRC, чтобы определить, что файл все еще находится в исходном состоянии.

вопрос в том, как поместить значение CRC в файл, не изменяя значение CRC самого файла? Я могу придумать пару решений, но я думаю, что должен быть довольно стандартный решение этой проблемы.

7 ответов


вы можете добавить значение CRC в конец файла. Затем при вычислении значения CRC позже для проверки опустите последние четыре байта.


определите заголовок, сгенерируйте CRC всего, кроме заголовка, затем поместите значение в заголовок.


общее решение-просто использовать разные файлы. Рядом с каждым файлом просто есть файл с тем же именем файла с другим расширением. Например: foobar.txt и foobar.txt.md5 (or .КПР.)


общее решение, которое широко используется в протоколах связи, состоит в том, чтобы установить поле 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.Конфиг.