Главная страница
    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.46 MB
Время: 0.034 c
4-1107774683
Skier
2005-02-07 14:11
2005.03.20
Как залить регион окна прозрачной кистью ?


3-1108277116
martin_
2005-02-13 09:45
2005.03.20
сервер InterBase и файловые системы


4-1107338164
Tango
2005-02-02 12:56
2005.03.20
управление tabcontrol в чужом приложении


9-1104227841
Xenon
2004-12-28 12:57
2005.03.20
Вопрос про свойства объектов


1-1110302263
Spl
2005-03-08 20:17
2005.03.20
Bitmap





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