ilgizmulukov Опубликовано 4 мая, 2006 Жалоба Поделиться Опубликовано 4 мая, 2006 подскажите алгоритм высчитывания CRC и CRC32.Если можно можно кусок кода на C++.И ещё rar высчитывает CRC для каждого файла в архиве или для архива в целом? Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 4 мая, 2006 Жалоба Поделиться Опубликовано 4 мая, 2006 (изменено) ilgizmulukov: всё просто это сложение по модулю два без переноса. CRC - 16 бит, CRC32 -32 бита. На С это делается одной командой, просто посмотри справочник по Си (любой стандартный, она там описанна). Вот алгоритм, используемый в PKZIP, ARJ, RAR: === Cut === #include <limits.h> typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long UCRC; #define CRCPOLY 0xEDB88320L #define UPDATE_CRC(r,c) r=crctable[((uchar)®^(uchar)©)&0xff]^(r>>CHAR_BIT) static UCRC crctable[uCHAR_MAX + 1]; UCRC cdecl crc; void make_crctable() { uint i, j; UCRC r; for (i = 0; i <= UCHAR_MAX; i++) { r = i; for (j = CHAR_BIT; j > 0; j--) { if (r & 1) r = (r >> 1) ^ CRCPOLY; else r >>= 1; } crctable = r; } } void crc_buf( char *str, int len) { while (len--) UPDATE_CRC(crc, *str++); } main() { crc = CRC_MASK; // Инициализация crc_buf( buffer, size); // Вычисление CRC по данным буфера ...... crc_buf( buffer, size); // Обновляем CRC со следующей порцией данных printf("Значение CRC - %lx", crc ^ CRC_MASK); } или на Паскале === Begin T-LNG.PAS === Crc:=0; For I:=1 To Size-2 Do Begin If P^ = #0 Then Begin Inc(J); Table^[J] := I; P:=P + 1; End else Begin Crc:= (Crc Shl 8) Xor CRCccittTable^[ (Crc Shr 8) Xor Ord(P^)]; P:= P + 1; End; End; Seek(F, Size - 2 ); BlockRead(F, ReadCRC, 2); If IOResult<> 0 then Count:=0; If Crc <> ReadCRC then Count:=0; === End T-LNG.PAS === ( CRC, ReadCRC - Word ) Таблица CRCccitTable (512 байт) создается следующей пpоцедуpой: === Begin CHECKCRC.PAS === Procedure MakeTableCCITT; const Patt = $1021; var i, w: byte; c: Word; begin For i:=0 to $FF do begin c:= i shl 8; For w:=1 to 8 do begin if (c And $8000) <> 0 then c:=(c shl 1) Xor Patt else c:=c shl 1; end; CrcCCITTtable^:=c; end; end; === End CHECKCRC.PAS === ( CrcCCITTtable - указатель на array[byte] of word ) В T-Mail'е она находится уже в подсчитанном виде, pавно как и таблица для CRC-32. === Cut === Изменено 4 мая, 2006 пользователем Indomito Ссылка на комментарий Поделиться на другие сайты Поделиться
ilgizmulukov Опубликовано 4 мая, 2006 Автор Жалоба Поделиться Опубликовано 4 мая, 2006 а можешь на словах описать что из себя представляет CRC Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 4 мая, 2006 Жалоба Поделиться Опубликовано 4 мая, 2006 (изменено) ilgizmulukov: "Ross N. Williams Элементарное руководство по CRC_алгоритмам обнаружения ошибок" crcguide.pdf Руководство на русском языке в PDF, можешь его конвертнуть в doc crcguide.pdf Изменено 9 мая, 2006 пользователем kolya7k Ссылка на комментарий Поделиться на другие сайты Поделиться
ilgizmulukov Опубликовано 5 мая, 2006 Автор Жалоба Поделиться Опубликовано 5 мая, 2006 А каким образом винрар сверяет пароль по CRC просто я тут нечто похожее хочу сделать Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 5 мая, 2006 Жалоба Поделиться Опубликовано 5 мая, 2006 ilgizmulukov: посчитай CRC и сравни ее с 16,32,64,128,256 crc записанной в файле, да crc должно быть две, до архивации и после архивации. Для надёжности лучше использовать сигнатуру. Примеры программ тебе приведенны. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти