Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

А-а! Почему 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 5.372 c
6-1106218936
Kirill
2005-01-20 14:02
2005.03.20
Декодировать MIME письмо


8-1102006537
Stiv
2004-12-02 19:55
2005.03.20
формат tga


14-1109537438
nick-from
2005-02-27 23:50
2005.03.20
CMS


6-1106410897
ferr
2005-01-22 19:21
2005.03.20
idTCP


6-1105980897
Piter
2005-01-17 19:54
2005.03.20
Как можно узнать о разрыве RAS соединения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский