CRC для формата файла PNG - PullRequest
1 голос
/ 28 марта 2010

Мне нужно прочитать файл PNG, интерпретировать всю информацию, хранящуюся в нем, и распечатать его в удобочитаемом формате.Работая над PNG, я понял, что он использует CRC-32 для генерации контрольной суммы для каждого чанка.Но я не мог понять следующую информацию, упомянутую на сайте спецификации файлов PNG: Полином, используемый PNG: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x+ 1

Вот ссылка для справки: http://www.w3.org/TR/PNG/

Может кто-нибудь, пожалуйста, помогите мне понять это?

Ответы [ 3 ]

6 голосов
/ 28 марта 2010

Это алгоритм CRC-32, реализованный в zlib. Пожалуйста, не создавайте свои собственные, когда вы можете использовать эту библиотеку вместо этого.


[РЕДАКТИРОВАТЬ]: Как использовать калькулятор CRC из zlib (пример на C, извлеченный из документов zlib).

#include <zlib.h>

uLong crc = crc32(0L, Z_NULL, 0);

while (read_buffer(buffer, length) != EOF) {
   crc = crc32(crc, buffer, length);
}
if (crc != original_crc) error();

Если у вас есть блок данных, для которого вы хотите получить CRC, вам не нужен этот цикл while; вы просто получаете начальное значение (первое присвоение crc выше), а затем вычисляете значение по имеющимся у вас данным (второе присвоение crc).

4 голосов
/ 28 марта 2010

http://en.wikipedia.org/wiki/Computation_of_CRC?

Согласно списку CRC в вики, этот многочлен (он же многочлен AUTODIN II) является одним из наиболее часто используемых. CRC-32-IEEE 802.3 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

Используется в (Ethernet, V.42, MPEG-2, PNG, POSIX cksum, Arj, Lha32, Rar, Zip и т. Д.)

Переписано с силой, отмеченной ^:

 x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1.

Так что вы можете прочитать источник cksum, например, здесь

http://www.opensource.apple.com/source/file_cmds/file_cmds-188/cksum/crc32.c

32-битный AutoDIN-II CRC построен при следующем сдвиговом регистре эталонная модель

Полином: г (х) = 1 + х + х ^ 4 + х ^ 5 + х ^ 7 + х ^ 8 + х ^ 10 + х ^ 11 + х ^ 12 + х ^ 1 + х ^ 22 + х ^ 23 + х ^ 26 + х ^ 32

Сначала бит ввода данных 0

Leading-zero checking is performed by the following procedure:

 1. The crc register is initialized to 0xffffffff, not zero.

 2. When a crc is appended, the 32 bits of the crc are inverted.

 3. When checking a good message with an appended crc, the register
    will return to the fixed value of 0xdebb20e3, rather than zero.
0 голосов
/ 28 марта 2010

Вы читали статьи в Википедии о CRC? Единого формата CRC не существует, каждый «формат» построен на полиноме, подобном этому.

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

...