Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема при расчете контрольной суммы и внесении ее в файл. [D7]


dorik ©   (2010-03-25 17:25:00) 

Чето уже не соображаю. Может у кого идеи есть.
Контрольные суммы при загрузке и при сохранении не соответствуют друг-другу. Причем отличаются немного, где-то -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;


evvcom   (2010-03-31 17:48:00) [1]

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


evvcom   (2010-03-31 17:43:00) [2]

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


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

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


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

Inc'и


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

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


MBo   (2010-03-25 17:43:00) [6]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо