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

Вниз

Как подсчитать контрольную сумму файла?   Найти похожие ветки 

 
Eugene_post   (2002-10-23 19:36) [0]

Здравствуйте!
Господа мастера!

Подскажите как подсчитать контрольную сумму файла?


 
Anatoly Podgoretsky   (2002-10-23 20:14) [1]

Сложить все байты по модулю 256


 
Eugene_post   (2002-10-23 20:17) [2]

Анатолий

А можно по подробнее?


 
jack128   (2002-10-23 20:19) [3]

по модулю 256 = x mod 256


 
Eugene_post   (2002-10-23 20:59) [4]

Сорри, я не понимаю как это сделать, можно код?


 
Anatoly Podgoretsky   (2002-10-23 21:21) [5]

По модулю 256 в данном контесте означает игнорировать перенос, можно конечно и так, но эффективнее просто использовать байт и блокровать ошибку переполнения. Хотя сама операция не занимает много времени, но она может выполняться над большим массивом данных

Eugene_post (23.10.02 20:59)
Чего тут понимать, читать файл по байтно и суммировать все байты в переменной типа байт, как правило применять это требуется очень редко, эффективность такой проверки чрезвычайно низкая, для более качественной защиты использую как минимум какой нибудь алгоритм CRC


 
Eugene_post   (2002-10-23 21:25) [6]

А можно спросить что такое алгоритм CRC?


 
Anatoly Podgoretsky   (2002-10-23 21:37) [7]

Можно, это код уменьшающий ошибку (в переводе), основан на более сложном алгоритме, чем просто суммирования байтов, сущестует большое количество таких алгоритмом, ряд из них признан стандартными.
Может подойдем к сути, что ты хочешь сделать, зачем, а то как то беспрдметно.
Но свой вопрос ты уже давно получил ответ, суммируй все байты по модулю 256, по окончанию получишь контрольную сумму.


 
Jeer   (2002-10-23 21:42) [8]

Алгоритм CRC это метод вычисления сигнатуры(контрольной суммы) данных, позволяющий с известной вероятностью определить достоверность данных при их возможных искажениях в процессе передачи, хранения..

На начальной стадии создания методов проверки достоверности данных назывался КОНТРОЛЬНАЯ СУММА (КС) или CHECK SUM (CS), затем, с усложнением алгоритмов, - Cyclic Redundancy Check (CRC).
Базируется на полиномиальной алгебре - исходная последовательность делиться на неприводимый полином выбранной структуры (полином с максимальным периодом)
Вот примеры полиномов
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035389740&n=0
x^32 + x^7 + x^5 + x^3 + x^2 + x + 1, 2^32 -1
x^40 + x^5 + x^4 + x^3 + 1, 2^40 -1
x^48 + x^7 + x^5 + x^4 + x^2 + x + 1, 2^48 -1


 
Eugene_post   (2002-10-23 21:47) [9]

Анатолий

Мне нужно сделать следующее: при изменении кода моей программы, будь то прямое редактирование кода или написание программы-патча, перед запуском моей программы шла проверка на изменение кода и если это произошло просто прерывать программу.

P.S. если неохота отвечать подробнее, то я сам попытаюсь найти где-нибудь ответ.


 
Ученик   (2002-10-23 21:52) [10]

>Jeer © (23.10.02 21:42)
Если можно, проведите урок до конца, как это превращается в вычисление, например CRC-32 ?


 
Anatoly Podgoretsky   (2002-10-23 22:08) [11]

Eugene_post (23.10.02 21:47)
Защита дело тонкое, учти что будут выкусывать проверку не разбираясь как и что ты считаешь. Но в любом случае CRC эффективнее чем CS

Ученик © (23.10.02 21:52)
Алгоритмов очень много, быстрые делаются по таблице, более медленные алгоритмическим путем, с помощью вычисления полинома
Вот мой старый алгоритм, наверно не эффективный, писался в 1996 году для Д2, советую поискать в FAQ и другие реализации, этот просто как пример.

const
CrcPolynominal = $04C11DB7;

//////////////////////////////////////////////////////////////////////////
// Crc32 - Data byte and Current Crc Value //
// POLYNOMIAL USED IS //
// X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+1 //
//////////////////////////////////////////////////////////////////////////
function Crc32(Data:Byte; CurrentCrc:Longint) : Longint; assembler;
asm
MOV ECX,8
@1:
ROL AL,1
RCL EDX,1
JNC @2
XOR EDX,CrcPolynominal
@2:
LOOP @1
MOV EAX,EDX
end;

//*******************************
//* Calculate Crc32 with buffer *
//*******************************
function BufToCrc(const Buf; Count:Integer) : Longint;
var
I : Integer;
begin
Result := $FFFFFFFF;
for I := 0 to Count - 1 do begin
Result := Crc32(Byte(TByteArray(Buf)[I]),Result);
end;
end;

//*******************************
//* Calculate Crc32 with string *
//*******************************
function StrToCrc(Value:string) : Longint;
var
I : Integer;
begin
Result := $FFFFFFFF;
for I := 1 to Length(Value) do begin
Result := Crc32(Byte(Value[I]),Result);
end;
end;



 
Jeer   (2002-10-23 22:10) [12]

Места маловато будет :))
Тем более, что Инет позаботился о Вас..
http://embedded.ifmo.ru/embedded_old/ETC/REFERAT/crc/crc.htm

Для электронщиков(ассемблерщиков) - можно представить себе сдвиговый регистр с отводами от необходимых разрядов (при степенях Х) и все отводы и входная однобитная последовательность складываются по "модулю 2" и вводяться побитно в регистр.
После прохождения всего числа в регистре и окажется сигнатура (CRC).
Этот метод экстраполируется и на многобитную обработку.

Для ускорения вычисления реально используются табличные методы.


 
Jeer   (2002-10-23 22:13) [13]

Кстати, те же неприводимые полиномы используются и для генерации псевдослучайных чисел.


 
Ученик   (2002-10-23 22:28) [14]

>Jeer © (23.10.02 22:10)
Большое спасибо !!!

>Eugene_post
Еще один вариант реализации

const
CrcSeed = $ffffffff;

const
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);

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 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 CrcFile(const FileName : string) : DWORD;
var
Stream : TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead + fmShareDenyNone);
try
Result := CrcStream(Stream)
finally
Stream.Free
end
end;


 
Anatoly Podgoretsky   (2002-10-23 22:36) [15]

Вариант с таблицей лучше полностью перевести на Паскаль, алгоритмический так просто не переведешь


 
Jeer   (2002-10-23 22:39) [16]

Да, это табличный метод с порождающим полиномом

X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0

Copyright (C) 1986 Gary S. Brown
Converted to Turbo Pascal (tm) V4.0 March, 1988 by J.R.Louvau

FUNCTION UpdC32(octet: BYTE; crc: LONGINT) : LONGINT;
BEGIN { UpdC32 }
UpdC32 := crctabду32[BYTE(crc XOR LONGINT(octet))] XOR ((crc SHR 8) AND $00FFFFFF)
END;


 
Ученик   (2002-10-23 22:52) [17]

>Anatoly Podgoretsky © (23.10.02 22:36)
{====================================================}
{ }
{ EldoS Visual Components }
{ }
{ Copyright (c) 1998-2001, EldoS }
{ }
{====================================================}

const
CRC32_POLYNOMIAL = $EDB88320;

var
Ccitt32Table : array[0..255] of longint;

function crc32(crc : longint; const c : byte) : longint;
begin
crc32 := (((crc shr 8) and $00FFFFFF) xor (Ccitt32Table[(crc xor c) and $FF]));
end;

procedure BuildCRCTable;
var
i, j, value : DWORD;
begin
for i := 0 to 255 do
begin
value := i;
for j := 8 downto 1 do
begin
if ((value and 1) <> 0) then
value := (value shr 1) xor CRC32_POLYNOMIAL
else
value := value shr 1;
end;
Ccitt32Table[i] := value;
end
end;


 
Jeer   (2002-10-23 23:01) [18]

Ученик © (23.10.02 22:52)

Это тоже табличный метод, только таблица вычисляется, а не храниться.

См
Jeer © (23.10.02 22:39)
UpdC32 := crctable32[BYTE(crc XOR LONGINT(octet))] XOR ((crc SHR 8) AND $00FFFFFF)


 
Anatoly Podgoretsky   (2002-10-23 23:11) [19]

Ученик © (23.10.02 22:52)
Обрати внимание на это

ROL AL,1
RCL EDX,1
JNC @2

Здесь используется флаг переноса, а Паскале до него нет доступа. Но все зависит от целей, мне единственно не нравится, так это использование ассемблерных команд, не переносимость например на технологию .NET



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

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

Наверх





Память: 0.51 MB
Время: 0.01 c
3-11122
jaric
2002-10-16 16:15
2002.11.04
При работе с DBgrid-ом EInvalidPointer...


14-11471
TAIPHOON
2002-10-11 20:31
2002.11.04
Win2000Server


3-11130
studentik
2002-10-15 16:45
2002.11.04
Работаю с БД InterBase6.5...


1-11182
Lola
2002-10-24 14:05
2002.11.04
Нумерация недель в календаре


3-11042
VikOss
2002-10-14 16:59
2002.11.04
Удаление





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский