![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при расчете контрольной суммы и внесении ее в файл. [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]инки местами поменяй