Главная страница
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.48 MB
Время: 0.077 c
1-1110063396
qqq2
2005-03-06 01:56
2005.03.20
Ошибочка


3-1108632194
Rule
2005-02-17 12:23
2005.03.20
Странно необъяснимое поведение хранимой процедуры в Фаерберде ...


14-1109590687
AlexG
2005-02-28 14:38
2005.03.20
Какую машину покупать?


1-1110167360
X-Disa
2005-03-07 06:49
2005.03.20
Отлов щелчка мыши


8-1102070757
Demon_new
2004-12-03 13:45
2005.03.20
Глюки перерисовки TImage