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

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

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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