Текущий архив: 2002.07.29;
Скачать: CL | DM;
Вниз
Алгоритмы подсчета контрольной суммы Найти похожие ветки
← →
Grrey (2002-07-16 09:42) [0]Есть задача - проверить обрабатываемую информацию! Собираюсь использовать контрольную сумму, но алгоритмы не знаю! Если кто в курсе, помогите чем можите (статьи, ссылки и любые доки принимаются с благодагностью!)
← →
Mike_Goblin (2002-07-16 09:46) [1]http://lib.mipt.ru/books/Security/hacking/ReverseCRC.htm
← →
Grrey (2002-07-16 14:32) [2]Спасибо!
А на русском ничего нет?
← →
Eugene Lachinov (2002-07-16 14:38) [3]Не на русском, но надеюсь, понятном :-)
unit Crc_32;
interface
uses
Classes{$IFDEF WIN32}, Windows;{$ELSE};
type
DWORD = LongInt;
{$ENDIF}
const
CrcSeed = $ffffffff;
function Crc32(Buffer : Pointer; const BufLen : DWord; Crc : DWord = CrcSeed) : DWORD;
function Crc8(Buffer : Pointer; BufLen : DWord; Crc : Byte) : Byte;
function StringCrc8(const S : string; CRC : Byte) : Byte;
function StringCrc32(const S : string; CRC : DWORD = CrcSeed) : DWORD;
function CrcString (Crc : DWORD) : string;
function CrcStream(Stream : TStream) : DWORD;
function CrcFile(const FileName : string) : DWORD;
implementation
uses
SysUtils;
const
crctable8 : array[0..255] of Byte = (
$00,$5E,$BC,$E2,$61,$3F,$DD,$83,$C2,$9C,$7E,$20,$A3,$FD,$1F,$41,
$9D,$C3,$21,$7F,$FC,$A2,$40,$1E,$5F,$01,$E3,$BD,$3E,$60,$82,$DC,
$23,$7D,$9F,$C1,$42,$1C,$FE,$A0,$E1,$BF,$5D,$03,$80,$DE,$3C,$62,
$BE,$E0,$02,$5C,$DF,$81,$63,$3D,$7C,$22,$C0,$9E,$1D,$43,$A1,$FF,
$46,$18,$FA,$A4,$27,$79,$9B,$C5,$84,$DA,$38,$66,$E5,$BB,$59,$07,
$DB,$85,$67,$39,$BA,$E4,$06,$58,$19,$47,$A5,$FB,$78,$26,$C4,$9A,
$65,$3B,$D9,$87,$04,$5A,$B8,$E6,$A7,$F9,$1B,$45,$C6,$98,$7A,$24,
$F8,$A6,$44,$1A,$99,$C7,$25,$7B,$3A,$64,$86,$D8,$5B,$05,$E7,$B9,
$8C,$D2,$30,$6E,$ED,$B3,$51,$0F,$4E,$10,$F2,$AC,$2F,$71,$93,$CD,
$11,$4F,$AD,$F3,$70,$2E,$CC,$92,$D3,$8D,$6F,$31,$B2,$EC,$0E,$50,
$AF,$F1,$13,$4D,$CE,$90,$72,$2C,$6D,$33,$D1,$8F,$0C,$52,$B0,$EE,
$32,$6C,$8E,$D0,$53,$0D,$EF,$B1,$F0,$AE,$4C,$12,$91,$CF,$2D,$73,
$CA,$94,$76,$28,$AB,$F5,$17,$49,$08,$56,$B4,$EA,$69,$37,$D5,$8B,
$57,$09,$EB,$B5,$36,$68,$8A,$D4,$95,$CB,$29,$77,$F4,$AA,$48,$16,
$E9,$B7,$55,$0B,$88,$D6,$34,$6A,$2B,$75,$97,$C9,$4A,$14,$F6,$A8,
$74,$2A,$C8,$96,$15,$4B,$A9,$F7,$B6,$E8,$0A,$54,$D7,$89,$6B,$35);
crctable32 : array[0..255] of DWORD = (
$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);
← →
Eugene Lachinov (2002-07-16 14:39) [4]
function Crc8(Buffer : Pointer; BufLen : DWord; Crc : Byte) : Byte;
asm
push edi
mov edi, eax
mov al, cl
mov ecx, edx
and ecx, ecx
jz @Exit
and edi, edi
jz @Exit
xor edx, edx
@Start:
mov dl, al
xor dl, [edi]
mov al, byte ptr [edx + crctable8]
inc edi
loop @Start
@Exit:
pop edi
end;
const
MaxStrucSize = 65520;
function Crc32(Buffer : Pointer; const BufLen : DWord; Crc : DWord) : DWORD; assembler;
asm
push edi
mov edi, eax
mov eax, ecx
mov ecx, edx
and ecx, ecx
jz @Exit
and edi, edi
jz @Exit
@Start:
xor edx, edx
mov dl, al
shr eax, 8
xor dl, [edi]
xor eax, dword ptr [4 * edx + crctable32]
inc edi
loop @Start
@Exit:
pop edi
end;
function CrcString (Crc : DWORD) : string;
const
hexChars: array [0..$F] of Char = "0123456789ABCDEF";
var
i : byte;
begin
{$IFDEF WIN32}
SetLength(Result, 8);
{$ELSE}
Result[0] := #8;
{$ENDIF}
for i := 8 downto 1 do begin
Result[i] := HexChars[crc and $F];
crc := crc shr 4;
end
end;
function CrcStream(Stream : TStream) : DWORD;
var
P : Pointer;
C : LongInt;
begin
Result := CrcSeed;
GetMem(P, 8192);
try
Stream.Position := 0;
while Stream.Position < Stream.Size do begin
C := Stream.Read(P^, 8192);
Result := Crc32(P, C, Result)
end
finally
FreeMem(P, 8192)
end;
Result := Result xor CrcSeed
end;
function StringCrc32(const S : string; CRC : DWORD) : DWORD;
begin
Result := Crc32(@S[1], Length(S), CRC)
end;
function StringCrc8(const S : string; Crc : Byte) : Byte;
begin
Result := Crc8(@S[1], Length(S), Crc)
end;
function CrcFile(const FileName : string) : DWORD;
var
Stream : TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead + fmShareDenyNone);
try
Result := CrcStream(Stream)
finally
Stream.Free
end
end;
end.
← →
Grrey (2002-07-16 14:46) [5]Спасибо!
А на русском ничего нет?
← →
Grrey (2002-07-16 14:56) [6]Громадное СПАСИБО!!!!
Это именно то, что нужно!
КЛАСС!!!
← →
Grrey (2002-07-16 14:57) [7]Спасибо!
А на русском ничего нет?
← →
Krok (2002-07-16 15:02) [8]Я еще вариант на мыло послал(он попроще) - глянь
Страницы: 1 вся ветка
Текущий архив: 2002.07.29;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.007 c