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 должно быть две, до архивации и после архивации. Для надёжности лучше использовать сигнатуру. Примеры программ тебе приведенны. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.