Главная страница
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.008 c
2-1310113245
Andrey34324
2011-07-08 12:20
2011.10.30
Выборка из Listview уникальных значений.


4-1251465883
Deltas
2009-08-28 17:24
2011.10.30
Консольное приложение. Иконка в области уведомлений.


1-1269856808
Локара
2010-03-29 14:00
2011.10.30
Где Delphi 7 хранит инф-цию о пакетах


2-1310440871
R_R
2011-07-12 07:21
2011.10.30
"Asynchronous socket error 10060"


15-1309765210
PiterK
2011-07-04 11:40
2011.10.30
Обводка изображения