Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
ВнизРазные результаты компрессии CompressBuf и TCompressionStream Найти похожие ветки
← →
SergP. (2005-10-02 17:59) [0]Пробую сохранять в файл содержимое динамического массива, производя при этом компрессию данных:
Вот две процедуры. Одна использует 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-02 18:25) [1]PS, Для сравнения:
Файл сохраненный с того же массива (без компрессии) с помощью assignfile, blockwrite имеет длину 5880 байт, а этот же файл сжатый zip"ом - 154 байта
← →
begin...end © (2005-10-02 18:41) [2]Эта ошибка никогда не кончится...
> WriteBuffer(pointer(history),length(history)*sizeof(history[0]))
WriteBuffer(pointer(history)^,length(history)*sizeof(history[0]))
или
WriteBuffer(history[0],length(history)*sizeof(history[0]))
← →
alexbou (2005-10-02 18:49) [3]...при условии что history не &String или WideString... а то хлебнешь проблем
...вот если PChar или PWideChar - тогда конечно все ОК
← →
SergP. (2005-10-02 18:52) [4]
> begin...end © (02.10.05 18:41) [2]
Блин. Действительно не заметил что в compressbuf первый параметр pointer,
а в WriteBuffer - longint
Спасибо. Теперь оба файла одинаковые.
← →
SergP. (2005-10-02 19:07) [5]
> 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;
← →
alexbou (2005-10-03 18:03) [6]history: array of histrecord ?
...то есть динамический?
хм.... чет-то не нравится.... структура внутренняя динамических массивов примерна равна &String.... то есть это управляемый указатель
← →
SergP. (2005-10-03 18:56) [7]
> хм.... чет-то не нравится....
Но уже все работает как положено...
А какая разница - статический массив или динамический?
Все равно в случае с динамическим массивом я делаю так:
...
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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c