Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

А-а! Почему TDecompressionStream распаковывает не то?! [D7, WinXP]


Aleksandr. ©   (2005-03-03 16:03:00) 

Упаковываю 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 распаковывает полученные данные с другим размером! Что тут не так?


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

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


MU   (2005-03-03 16:34:00) [2]

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


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

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


MU   (2005-03-03 16:09:00) [4]

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


MU   (2005-03-03 16:07:00) [5]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо