Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Распаковка GZIP


Автор: VICTAR 19.3.2007, 23:20
Имеем строку, запакованную GZIP
Код

Ў|§tЌ?«ВљLаYO‘Ќ\bJ] m—ч<FПqЛ

Каким образом её можно распаковать?

Спасибо.

Автор: Snowy 19.3.2007, 23:39
Весьма информативная строчка smile
Сходи на torry и скачай компонент для работы с Gzip ;-)

Автор: VICTAR 20.3.2007, 00:18
Уже сходил, скачал, спасибо, не помогло  smile .  
http://www.torry.net/vcl/compress/std/compressD7.zip как я понял, он распаковывает только файлы, хотелось бы работать со стримами.

Описываю проблему подробнее: в http://agent.mail.ru/protocol.html?Submit=%CF%F0%E8%ED%E8%EC%E0%FE+%F1%EE%E3%EB%E0%F8%E5%ED%E8%E5(протокол mailagent`a) rtf-часть сообщения выглядит как:
Код

BASE64(
        GZIP(
            UL количество LPS (должно быть не менее 2)
            LPS rtf_text_with_all_rtf_headers_and_tags
            LPS цвет фона в виде UL
             )
         ) 


Если кто-то сталкивался с этим делом, откликнитесь.

Автор: MetalFan 20.3.2007, 09:10
так сначала надо раскодировать base64, а потом уже пытаться распаковать gzip'ом.
и что все бросились mail-агенты писать?!

Автор: VICTAR 20.3.2007, 10:22
Цитата(MetalFan @  20.3.2007,  09:10 Найти цитируемый пост)
так сначала надо раскодировать base64

Ну я не совсем  smile, раскодировал естественно  smile 


Цитата(MetalFan @  20.3.2007,  09:10 Найти цитируемый пост)
и что все бросились mail-агенты писать?! 

Сейчас так модно  smile. Шучу, просто надо.  

Автор: MetalFan 20.3.2007, 11:08
в JVCL есть вроде компонент и класс, что с потоками(или буферами) может работать...
я его примерно так юзал:
Код

  function DoDecompressStream( ASourceStream, ADestStream: TStream ): Integer;
  var
    lDecompStream: TJclZLibDecompressStream;
    lBuffer: array [0..1024] of Byte;
    lCount: Integer;
  begin
    Result := 0;
    ASourceStream.Seek(0, 0);
    lDecompStream := TJclZLibDecompressStream.Create(ASourceStream);
    try
      repeat
        lCount := lDecompStream.Read(lBuffer, SizeOf(lBuffer));
        ADestStream.Write(lBuffer, lCount);
        Inc( Result, lCount);
      until (lCount = 0);
    finally
      lDecompStream.Free;
    end;
  end;

если надо, могу попробовать выдрать необходимое для работы без всей jcl|jvcl

Автор: Snowy 20.3.2007, 11:50
Цитата(MetalFan @  20.3.2007,  11:08 Найти цитируемый пост)
в JVCL есть вроде компонент и класс, что с потоками(или буферами) может работать...
А что, родной ZLib уже не устраивает?
Почему постоянно нужно тащить в свой всякий хлам с помойки, вместо того, чтобы использовать родные средства?
GZip - по сути ZLib в обёртке.
Точнее ZLib - компрессия, применяемая в GZip.

Добавлено @ 11:54 
Код

uses classes, ZLib;

procedure DecompressStream(inpStream,outStream: TStream);
var InpBuf,OutBuf: Pointer;
var OutBytes,sz: integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  sz := inpStream.size-inpStream.Position;
  if sz > 0 then try
    GetMem(InpBuf,sz);
    inpStream.Read(InpBuf^,sz);
    DecompressBuf(InpBuf,sz,0,OutBuf,OutBytes);
    outStream.Write(OutBuf^,OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
  outStream.Position := 0;
end;

Автор: MetalFan 20.3.2007, 12:31
Snowy, да? пасиб, не знал. просто думал в D6 нет его... поискал - есть Zlib.dcu...
кста, там есть TDecompressionStream...

Автор: Snowy 20.3.2007, 14:43
Да есть.
Просто лень было проверять на идентичность - взял код, применяемый для распаковки GZip в http.

Добавлено @ 14:44 
А, ну да. Для распаковки через TDecompressionStream необходимо знать исходный размер несжатых данных.
А нам он не известен.

Автор: VICTAR 20.3.2007, 16:39
MetalFan, Snowy,  бАльшое спасибо  smile.  Проблема решена, оказывается дело было в неправильном раскодировании base64, из-за этого и не мог правильно распаковать.

Автор: Igor_thief 28.10.2008, 12:33
VICTAR, а где потом распаковываешь? Из Дельфи программы или ... ? Просто у меня похожая задача и никак не получается запакованую и замаймленую в Дельфи строку разжать в C#.

Автор: Alexeis 28.10.2008, 13:08
Igor_thief, дали же наводку. Создаешь поток TFileStream или TMemoryStream, который будет содержать то что упаковано, затем создаешь TDecompressionStream, извлекаешь в другой TMemoryStream, после чего достаешь данные из base64 (реализаций извлечения из base64 навалом). 

Автор: Igor_thief 28.10.2008, 13:28
Alexeis, Читай внимательней то что я написал!

Если бы все делалось в одной программе, то все было бы просто (или даже на одном компе). Но задача куда сложнее. Упаковываться и передаваться по инету должна строка.

Задача уже решена!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)