Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.30;
Скачать: CL | DM;

Вниз

Проблема при расчете контрольной суммы и внесении ее в файл.   Найти похожие ветки 

 
dorik   (2010-03-25 17:25) [0]

Чето уже не соображаю. Может у кого идеи есть.
Контрольные суммы при загрузке и при сохранении не соответствуют друг-другу. Причем отличаются немного, где-то -150...0...150. Как будто один лишний символ прибавляется.

Функция расчета контрольной суммы:
function CalcChecksum(Data:Pointer; Size:Longint): Longint;
var
 i: integer;
 b:PByte;
begin
 Result := 0;
 b := PByte(Data);
 if Size = 0 then Exit;
 for i := 1 to Size do
 begin
   inc(b);
   Inc(Result, Ord(b^));
 end;
end;


Процедура загрузки файла:
var
 DataStream:TMemoryStream;
 Sum:LongInt;
begin
 if not FileExists(DBFILE) then Exit;
 DataStream := TMemoryStream.Create;
 DataStream.LoadFromFile(DBFILE);

 DataStream.Position := 0;
 DecryptStream(DataStream,DataStream.Size,PASSWORD); //Расшифровываем данные

 DataStream.Position := DataStream.Size-SizeOf(LongInt);
 DataStream.Read(Sum,SizeOf(LongInt)); //Читаем контрольную сумму файла

 DataStream.SetSize(DataStream.Size-SizeOf(LongInt)); //удаляем контрольную сумму

 DataStream.Position := 0;

 if CalcChecksum(DataStream.Memory, DataStream.Size) <> Sum then
 begin
   ShowMessage("Пароль неверен!");
   DataStream.Free;
   Exit;
 end;

 DataStream.Position := 0;
 NoteEdit.Lines.LoadFromStream(DataStream);
 DataStream.Free;
 NoteEdit.Modified := False;


Процедура сохранения:
var
 DataStream:TMemoryStream;
 Sum:LongInt;
begin
 DataStream := TMemoryStream.Create;
 NoteEdit.Lines.SaveToStream(DataStream);

 Sum := CalcChecksum(DataStream.Memory, DataStream.Size); //Считаем контрольную сумму

 DataStream.SetSize(DataStream.Size+SizeOf(LongInt)); //создаем место для суммы

 DataStream.Position := DataStream.Size-SizeOf(LongInt);
 DataStream.Write(Sum,SizeOf(LongInt)); //записываем сумму

 DataStream.Position := 0;
 EncryptStream(DataStream,DataStream.Size,PASSWORD); //Зашифровываем

 DataStream.Position := 0;
 DataStream.SaveToFile(DBFILE); // сохраняем в файл
 DataStream.Free;

 NoteEdit.Modified := False;


 
MBo ©   (2010-03-25 17:43) [1]

инки местами поменяй


 
dorik   (2010-03-25 19:07) [2]

чего поменять?


 
Германн ©   (2010-03-25 19:18) [3]

Inc"и


 
dorik   (2010-03-25 23:04) [4]

Ааа! Точняк, я даун)) Мдя... Спрасибо!


 
evvcom ©   (2010-03-31 17:43) [5]

а чем API Win32 функция MapFileAndCheckSum не нравится? Чего велосипед изобретать?


 
evvcom ©   (2010-03-31 17:48) [6]

или даже API функции Crypt*



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

Текущий архив: 2011.10.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
15-1309811398
Юрий
2011-07-05 00:29
2011.10.30
С днем рождения ! 5 июля 2011 вторник


2-1310404809
Qq
2011-07-11 21:20
2011.10.30
Не открывает проект


11-1238921424
MTsv DN
2009-04-05 12:50
2011.10.30
Использование LIB в Дельфи


2-1310431807
R_R
2011-07-12 04:50
2011.10.30
TNMUdp


15-1309523246
cross
2011-07-01 16:27
2011.10.30
оператор with