Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Вниз

CRC32   Найти похожие ветки 

 
hamster ©   (2004-09-03 18:27) [0]

Здравствуйте. Скажите пожалуйста, как считать CRC32? Если можно-напишите функцию.


 
Palladin ©   (2004-09-03 18:29) [1]

Они разные бывают... 32 - лишь означает что результат 32 битный... можно и в байт уложиться...

"алгоритм вычисления контрольной суммы" + www.google.ru


 
ferr ©   (2004-09-03 18:48) [2]

Посмотри:
Элементарное руководство по CRC - алгоритмам...
Ross N. Williams.
Поищи на WASM.ru
Если не найдёшь, то могу намылить.


 
GEN++ ©   (2004-09-03 22:33) [3]

Пример из Kuliba1000
Сам я его не пробовал


Приведен модуль для Delphi 1.0 (для Delphi 2.0 должны быть сделаны небольшие изменения):

--------------------------------------------------------------------------------
   UNIT CRC32;

{CRC32 рассчитывает код циклической избыточности (cyclic redundancy code - CRC),
известный как CRC-32, с использованием алгоритма byte-wise ("мудрый байт").

(C) Авторские права 1989, 1995-1996 Earl F. Glynn, Overland Park, KS.
Все права защищены.

Данный модуль является производным от программы CRCT FORTRAN 77, опубликованной
в "Byte-wise CRC Calculations" за авторством Aram Perez из IEEE Micro, Июнь 1983,
страницы 40-50. Константы для полиномиального генератора CRC-32, приведенные
здесь, опубликованы в "Microsoft Systems Journal", Март 1995, страницы 107-108.

Данный CRC алгоритм имеет бОльшую скорость за счет 512 элементов таблицы
поиска.}

INTERFACE

PROCEDURE CalcCRC32 (p:  pointer; nbyte:  WORD; VAR CRCvalue:  LongInt);
PROCEDURE CalcFileCRC32 (FromName: STRING; VAR CRCvalue: LongInt;
VAR IOBuffer:  pointer;  BufferSize:  WORD; VAR TotalBytes:  LongInt;
VAR error:  WORD);

IMPLEMENTATION

CONST
table:  ARRAY[0..255] OF LongInt =
($00000000, $77073096, $EE0E612C, $990951BA,
$076DC419, $706AF48F, $E963A535, $9E6495A3,
$0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988,
$09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91,
$1DB71064, $6AB020F2, $F3B97148, $84BE41DE,
$1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7,
$136C9856, $646BA8C0, $FD62F97A, $8A65C9EC,
$14015C4F, $63066CD9, $FA0F3D63, $8D080DF5,
$3B6E20C8, $4C69105E, $D56041E4, $A2677172,
$3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B,
$35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940,
$32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59,
$26D930AC, $51DE003A, $C8D75180, $BFD06116,
$21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F,
$2802B89E, $5F058808, $C60CD9B2, $B10BE924,
$2F6F7C87, $58684C11, $C1611DAB, $B6662D3D,

$76DC4190, $01DB7106, $98D220BC, $EFD5102A,
$71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433,
$7807C9A2, $0F00F934, $9609A88E, $E10E9818,
$7F6A0DBB, $086D3D2D, $91646C97, $E6635C01,
$6B6B51F4, $1C6C6162, $856530D8, $F262004E,
$6C0695ED, $1B01A57B, $8208F4C1, $F50FC457,
$65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C,
$62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65,
$4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2,
$4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB,
$4369E96A, $346ED9FC, $AD678846, $DA60B8D0,
$44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9,
$5005713C, $270241AA, $BE0B1010, $C90C2086,
$5768B525, $206F85B3, $B966D409, $CE61E49F,
$5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4,
$59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD,

$EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A,
$EAD54739, $9DD277AF, $04DB2615, $73DC1683,
$E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8,
$E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1,
$F00F9344, $8708A3D2, $1E01F268, $6906C2FE,
$F762575D, $806567CB, $196C3671, $6E6B06E7,
$FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC,
$F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5,
$D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252,
$D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B,
$D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60,
$DF60EFC3, $A867DF55, $316E8EEF, $4669BE79,
$CB61B38C, $BC66831A, $256FD2A0, $5268E236,
$CC0C7795, $BB0B4703, $220216B9, $5505262F,
$C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04,
$C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D,

$9B64C2B0, $EC63F226, $756AA39C, $026D930A,
$9C0906A9, $EB0E363F, $72076785, $05005713,
$95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38,
$92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21,
$86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E,
$81BE16CD, $F6B9265B, $6FB077E1, $18B74777,
$88085AE6, $FF0F6A70, $66063BCA, $11010B5C,
$8F659EFF, $F862AE69, $616BFFD3, $166CCF45,
$A00AE278, $D70DD2EE, $4E048354, $3903B3C2,
$A7672661, $D06016F7, $4969474D, $3E6E77DB,
$AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0,
$A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9,
$BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6,
$BAD03605, $CDD70693, $54DE5729, $23D967BF,
$B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94,
$B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D);

TYPE
buffer = ARRAY[1..65521] OF BYTE;  { самый большой буфер, который     }
{ только можно распределить в Куче }
VAR
i:  WORD;
q:  ^buffer;

PROCEDURE CalcCRC32 (p:  pointer; nbyte:  WORD; VAR CRCvalue:  LongInt);
{Ниже выполняется небольшое криптование (но выполняется очень быстро).
Алгоритм работает следующим образом:
1.  совершаем операцию "И/ИЛИ" (XOR) входного байта с младшей
частью регистра CRC для получения INDEX
2.  сдвигаем регистр CRC на восемь битов вправо
3.  совершаем операцию "И/ИЛИ" (XOR) с CRC регистром и
Table[INDEX]
4.  повторяем шаги с 1 по 3 для всех байтов }
BEGIN
q := p;
FOR   i := 1 TO nBYTE DO
CRCvalue := (CRCvalue SHR 8)  XOR
Table[ q^[i] XOR (CRCvalue AND $000000FF) ]
END {CalcCRC32};

PROCEDURE CalcFileCRC32 (FromName:  STRING; VAR CRCvalue:  LongInt;
VAR IOBuffer:  pointer;  BufferSize:  WORD; VAR TotalBytes:  LongInt;
VAR error:  WORD);
VAR
BytesRead:  WORD;
FromFile :  FILE;
i        :  WORD;
BEGIN
FileMode := 0;  {Turbo по умолчанию 2 для R/W и 0 для R/O}
CRCValue := $FFFFFFFF;
ASSIGN (FromFile,FromName);
{$I-} RESET (FromFile,1); {$I+}
error := IOResult;
IF   error = 0
THEN BEGIN
TotalBytes := 0;
REPEAT
BlockRead (FromFile,IOBuffer^,BufferSize,BytesRead);
CalcCRC32 (IOBuffer,BytesRead,CRCvalue);
INC (TotalBytes, BytesRead)
UNTIL BytesRead = 0;
CLOSE (FromFile)
END;
CRCvalue := NOT CRCvalue
END {CalcFileCRC32};

END {CRC}.  



 
SelloutS   (2004-09-03 22:52) [4]

моу выслать кампаненту которая вычесляет crc32 как это деалет totalcommander 6.01 ...пишите письма :)


 
Sha ©   (2004-09-04 10:28) [5]

> GEN++ ©

Таблицу лучше генерировать самостоятельно при инициализации,
иначе трудно заметить в ней возможную ошибку.


 
hamster ©   (2004-09-04 20:49) [6]


> SelloutS


Давай, адрес - в анкете.
Спасибо.


 
Pat ©   (2004-09-04 23:56) [7]

Так CRC32 вычисляет Inno setup

var CRC32Table: array[Byte] of Longint;

procedure InitCRC32Table;
var
 CRC: Longint;
 I, N: Integer;
begin
 for I := 0 to 255 do begin
   CRC := I;
   for N := 0 to 7 do begin
     if Odd(CRC) then
       CRC := (CRC shr 1) xor Longint($EDB88320)
     else
       CRC := CRC shr 1;
   end;
   Crc32Table[I] := CRC;
 end;
end;

function UpdateCRC32 (CurCRC: Longint; const Buf; BufSize: Cardinal): Longint;
var
 P: ^Byte;
begin
 P := @Buf;
 while BufSize <> 0 do begin
   CurCRC := CRC32Table[Lo(CurCRC) xor P^] xor (CurCRC shr 8);
   Dec (BufSize);
   Inc (P);
 end;
 Result := CurCRC;
end;

function GetCRC32 (const Buf; BufSize: Cardinal): Longint;
begin
 Result := UpdateCRC32(Longint($FFFFFFFF), Buf, BufSize) xor Longint($FFFFFFFF);
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:="Pat";
InitCRC32Table;
caption:=format("%x",[GetCRC32(s[1],Length(s))]);
end;




Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.03 c
1-1094493087
lipskiy
2004-09-06 21:51
2004.09.19
Как разрешить обновляться только конкретному объекту?


14-1093769352
kaif
2004-08-29 12:49
2004.09.19
Хорошее применение для метода LIFO в складском учете


14-1093770941
able
2004-08-29 13:15
2004.09.19
Вопрос по ноутбукам.


1-1094220978
bloodman
2004-09-03 18:16
2004.09.19
Еще 1 Легкий вопрос теперь про приведение типов.


4-1091892408
IgorMarx
2004-08-07 19:26
2004.09.19
Запуск EXE из памяти, не выгружая на диск.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский