![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разные результаты компрессии CompressBuf и TCompressionStream [D6, WinME, Win2k, WinXP]
SergP. © (2005-10-02 17:59:00)Пробую сохранять в файл содержимое динамического массива, производя при этом компрессию данных:
Вот две процедуры. Одна использует TCompressionStream, вторая CompressBuf.
uses ... zlib ...
...
history: array of histrecord;
...
procedure save1;
var
fstream:TFileStream;
begin
fStream:=TFileStream.Create('qqq.qqq',fmCreate);
try
with TCompressionStream.Create(clMax,fstream) do
try
WriteBuffer(pointer(history),length(history)*sizeof(history[0]));
finally
Free;
end;
finally
fstream.free;
end;
end;
procedure save2;
var
OutBuf: Pointer;
OutBytes: Integer;
outstream:TFileStream;
begin
OutStream:=TFileStream.create('qqq.qqq',fmCreate);
OutBuf := nil;
try
try
CompressBuf(pointer(history),length(history)*sizeof(history[0]), OutBuf, OutBytes);
OutStream.Write(OutBuf^, OutBytes);
finally
if OutBuf <> nil then FreeMem(OutBuf);
end;
finally
OutStream.Free;
end;
end;
Почему в результате работы этих двух процедур я получаю слишком разные файлы.
Например для определенных данных массива, одних и тех же для обоих случаев , я получаю файл длиной в первом случае 2066 байт, во втором 88 байт?
SergP. (2005-10-03 18:56:00) [1]
> хм.... чет-то не нравится....
Но уже все работает как положено...
А какая разница - статический массив или динамический?
Все равно в случае с динамическим массивом я делаю так:
...
var
SVparam: record
HistoryLen:Cardinal;
AccountId:string[8];
end;
...
procedure datasave;
var
fstream:TFileStream;
begin
fStream:=TFileStream.Create(SVparam.AccountId+'.dat',fmCreate);
try
with TCompressionStream.Create(clMax,fstream) do
try
SVparam.HistoryLen:=length(history);
WriteBuffer(SVparam,sizeof(SVparam));
...// Сохраняем всю остальную фигню
WriteBuffer(history[0],length(history)*sizeof(history[0]));
finally
Free;
end;
finally
fstream.free;
end;
end;
procedure dataload;
var
fstream:TFileStream;
begin
fstream:=TFileStream.Create(SVparam.AccountId+'.dat',fmOpenRead or fmShareDenyWrite);
try
with TDecompressionStream.Create(fstream) do
try
ReadBuffer(SVparam,sizeof(SVparam));
...// Загружаем всю остальную фигню
SetLength(history,SVparam.HistoryLen);
ReadBuffer(history[0],SVparam.HistoryLen*sizeof(history[0]));
finally
free;
end;
finally
fstream.Free;
end;
end;
alexbou (2005-10-03 18:03:00) [2]history: array of histrecord ?
...то есть динамический?
хм.... чет-то не нравится.... структура внутренняя динамических массивов примерна равна &String.... то есть это управляемый указатель
SergP. (2005-10-02 19:07:00) [3]
> alexbou (02.10.05 18:49) [3]
> ...при условии что history не &String или WideString...
> а то хлебнешь проблем
> ...вот если PChar или PWideChar - тогда конечно все ОК
type
histrecord = record
htime:TDateTime;
htype:string[30];
hBatch:cardinal;
hemetal:string[10];
hWeight:string[15];
hToFromNumber:string[8];
hToFromName:string[60];
hEnteredAmount:currency;
hEnteredCurrency:string[3];
hRate:currency;
hMemo:string[200];
hPayeeName:string[200];
hPayeeAddress:string[200];
hRedemptionInfo:string[200];
hMerchantRefNumber:string[200];
end;
...
history: array of histrecord;
SergP. (2005-10-02 18:52:00) [4]
> begin...end © (02.10.05 18:41) [2]
Блин. Действительно не заметил что в compressbuf первый параметр pointer,
а в WriteBuffer - longint
Спасибо. Теперь оба файла одинаковые.
alexbou (2005-10-02 18:49:00) [5]...при условии что history не&String или WideString... а то хлебнешь проблем
...вот если PChar или PWideChar - тогда конечно все ОК
begin...end (2005-10-02 18:41:00) [6]Эта ошибка никогда не кончится...
> WriteBuffer(pointer(history),length(history)*sizeof(history[0]))
WriteBuffer(pointer(history) ^,length(history)*sizeof(history[0]))
или
WriteBuffer(history [0],length(history)*sizeof(history[0]))
SergP. (2005-10-02 18:25:00) [7]PS, Для сравнения:
Файл сохраненный с того же массива (без компрессии) с помощью assignfile, blockwrite имеет длину 5880 байт, а этот же файл сжатый zip'ом - 154 байта