Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1128111902
Dot
2005-10-01 00:25
2005.10.23
StrToInt


1-1127803083
mefodiy
2005-09-27 10:38
2005.10.23
Поиск строки в поисковом сайте через Internet Explorer


8-1117105281
Dadly
2005-05-26 15:01
2005.10.23
Как распознавать отсканированные отпечатки пальцев


11-1109452786
Ripper
2005-02-27 00:19
2005.10.23
REG MULTI STRING


14-1128184365
syte_ser78
2005-10-01 20:32
2005.10.23
Вопрос по Magic Forum 1.2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский