Расчеты CRC32 для png чанка не соответствуют реальным

Я пытаюсь имитировать функцию, используемую для создания CRC в файлах PNG, я использую полином Autodin II и исходный код из:
http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.c

Все мои тесты были для блока IHDR, поэтому мои параметры были такими:
crc — 0xffffffff и 0 (оба были предложены)
buff — адрес типа чанка IHDR.
длина — длина чанка IHDR + 4 (длина данных чанка + длина типа)

Я напечатал рассчитанный CRC в двоичном виде, который я сравнил с фактическим CRC фрагмента. Я не вижу никаких сходств (маленький-большой порядок, обратные биты, XOR и т. Д.).

Это данные для блока IHDR (шестнадцатеричный формат):
длина (big endian): d0 00 00 00 (13)
Тип: 49 48 44 52
данные: 00 00 01 77 00 00 01 68 08 06 00 00 00
существующий CRC: b0 bb 40 ac

Если кто-нибудь может сказать мне, почему мои вычисления отключены, или дать мне функцию CRC32, которая будет работать, я был бы очень признателен.
Спасибо!

1

Решение

Алгоритм CRC-32, используемый в изображениях PNG, описан здесь: http://www.w3.org/TR/PNG-Structure.html#CRC-algorithm (есть также ссылка на код C для выполнения тестовых вычислений).

Но, как отметил @Jigsore, вы не получите ощутимых результатов от данных, которые вы разместили здесь. Вы дали нам 4-байтовый идентификатор типа и то, что похоже на 7,5 байт данных, чтобы следовать за ним. Всего должно быть 13 байтов в соответствии с длиной заголовка.

РЕДАКТИРОВАТЬ:
Это работает с использованием функции из w3.org:

int main() {
char input[] = { 0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x77,0x00,
0x00,0x01,0x68,0x08,0x06,0x00,0x00,0x00 };
printf("%08lx\n",crc(input,17));
return 0;
}

Выход:
ac40bbb0

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector