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

Вниз

А-а! Почему TDecompressionStream распаковывает не то?!   Найти похожие ветки 

 
Aleksandr.   (2005-03-03 16:03) [0]

Упаковываю MemoryStream:

procedure DoEncode(M: TMemoryStream);
var
 Z   : TCompressionStream;
 Buf : array of byte;
 i,j : cardinal;
 D   : TStream;
begin
 M.Seek(0,0);
 i:=M.Size;
 D:=TMemoryStream.Create;
 Z:=TCompressionStream.Create(clDefault,D);
 try
   SetLength(Buf,i);
   j:=M.Read(Buf[0],i);
   if i<>j then
     raise Exception.Create("Length diffs!");
   Z.Write(Buf[0],i);
   D.Seek(0,0);
   M.Clear;
   M.Write(i,SizeOf(i));                            // write size of uncompressed data
   SetLength(Buf,D.Size);
   D.Read(Buf[0],Length(Buf));
   M.Write(Buf[0],length(Buf));
   M.Seek(0,0)
 finally
   Z.Free;
   D.Free
 end;

то бишь сразу после упаковки перед данными пишется размер пакуемого Stream.
Затем я пытаюсь распаковать упакованный Stream:

procedure DoDecode(M: TMemoryStream);
var
 Z   : TDeCompressionStream;
 Buf : array of byte;
 i   : cardinal;
 D   : TMemoryStream;
begin
 M.Seek(0,0);
 M.Read(i,SizeOf(i));                           // read size of uncompressed  file
 D:=TMemoryStream.Create;
 try
   SetLength(Buf,M.Size-M.Position);
   M.Read(Buf[0],length(Buf));
   D.Write(Buf[0],length(buf));
   D.Seek(0,0);
   Z:=TDecompressionStream.Create(D);
   try
     SetLength(Buf,i);
     i:=Z.Read(Buf[0],i);
     if i<>Length(Buf) then
       raise Exception.Create("length diffs!")
   finally
     Z.Free
   end
 finally
   D.Free
 end;
 M.Clear;
 M.Write(Buf[0],i);
 M.Seek(0,0)
end;

Так вот на ошибочку с
     if i<>Length(Buf) then
       raise Exception.Create("length diffs!")
я все время и получаю! То есть TDeCompressionStream распаковывает полученные данные с другим размером! Что тут не так?


 
MU   (2005-03-03 16:07) [1]

Что за бред?!
M.Write(i,SizeOf(i));                    
SizeOf + F1


 
MU   (2005-03-03 16:09) [2]

извините, ошибся... :(


 
Aleksandr.   (2005-03-03 16:10) [3]

MU  :
В чем тут Вы видите бред? Что, по-Вашему, надо писать в качестве количества байт записываемой информации?


 
MU   (2005-03-03 16:34) [4]

извините еще раз :)
а тут, когда вы только считали размер, значение i верное?
M.Seek(0,0);
M.Read(i,SizeOf(i)); // read size of uncompressed  file


 
Aleksandr.   (2005-03-03 17:07) [5]

MU  :
Да, верное. И при компрессе возвращает правильное число ужатых байт.
Пришлось пока все заменить на CompressBuf/DecompressBuf, и все работает правильно, но нафига тогда нужны объекты...



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.067 c
6-1105989056
vic_vm
2005-01-17 22:10
2005.03.20
Определить IP по доменному имени при выходе в инетчерез proxy


3-1108720041
Вудупипл
2005-02-18 12:47
2005.03.20
как зеркалировать FB


1-1109775906
Anatoliy T.
2005-03-02 18:05
2005.03.20
Word - форматирование абзаца


14-1109420532
dr Tr0jan
2005-02-26 15:22
2005.03.20
Перегрузка операторов в Pascal


3-1109040283
Киря
2005-02-22 05:44
2005.03.20
Как перегнать базу данных из PARADOX в ACCESS?