Перейти к содержанию
СофтФорум - всё о компьютерах и не только

подскажите алгоритм высчитывания CRC и CRC32


Рекомендуемые сообщения

подскажите алгоритм высчитывания CRC и CRC32.Если можно можно кусок кода на C++.И ещё rar высчитывает CRC для каждого файла в архиве или для архива в целом?

Ссылка на комментарий
Поделиться на другие сайты

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 ===

Изменено пользователем Indomito
Ссылка на комментарий
Поделиться на другие сайты

ilgizmulukov: "Ross N. Williams Элементарное руководство по CRC_алгоритмам обнаружения ошибок"

crcguide.pdf Руководство на русском языке в PDF, можешь его конвертнуть в doc

crcguide.pdf

Изменено пользователем kolya7k
Ссылка на комментарий
Поделиться на другие сайты

ilgizmulukov: посчитай CRC и сравни ее с 16,32,64,128,256 crc записанной в файле, да crc должно быть две, до архивации и после архивации. Для надёжности лучше использовать сигнатуру. Примеры программ тебе приведенны.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...