Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

Разные результаты компрессии 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1128071863
LordOfRock
2005-09-30 13:17
2005.10.23
Древовидная структура


2-1127468702
Киря
2005-09-23 13:45
2005.10.23
Как правильно сдеать запрос?


14-1127416528
Piter
2005-09-22 23:15
2005.10.23
Возможно, кому-то поднимет настроение :)


14-1128062277
Vladimir88
2005-09-30 10:37
2005.10.23
Delphi 2005


4-1124267637
Davinchi
2005-08-17 12:33
2005.10.23
Compound-файлы, как с ними работать