Главная страница
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.007 c
11-1238076620
SPeller
2009-03-26 17:10
2011.10.30
KOL и D2009


15-1309764636
Andy BitOff
2011-07-04 11:30
2011.10.30
Кто как решает задачу...


15-1309277924
tesseract
2011-06-28 20:18
2011.10.30
пивная тема.


3-1265218398
ther
2010-02-03 20:33
2011.10.30
как получить код исключения в запросе? ADO+sql sever


15-1309897804
Юрий
2011-07-06 00:30
2011.10.30
С днем рождения ! 6 июля 2011 среда