gzip decompression, browser (delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ErrorNeo, 21 Mar 2010.

  1. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    А ты запусти 1000 потоков в проге, написанной на инди и сразу поймешь, чем инди хуже ;)
     
  2. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    А нахрена 1000 потоков если и 300 упирается в лимит траффа?

    Инди дохрена процессорного времени отбирает?
     
    #22 GhostOnline, 6 Apr 2010
    Last edited: 6 Apr 2010
  3. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Это от канала зависит и от размера страниц. Может и 1к потоков не весь канал забивать, примеры есть.

    Слишком много ошибок начинает появляться при большом количестве потоков.
     
  4. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Нет, проверял, даже при большом количестве (+ 400) разницы нет. Проблема с инди в том что много логических ошибок, у меня на 9 основные исправлены, пока не замечал. А так использовать можно:)

    И кстати если при большом количестве у вас начинает в инди сыпаться мног ошибок - скорее всего плохая синхронизация потоков. Есть в инди одно узкое конечно место где все потоки сходятся, но там всё идеально сделано.(Файл IdComponent.pas, создание класса) Там речь идёт о критической секции и прикол в том что на XP(ещё где хз) при огромном количестве потоков эти критические секции(по сути системные объекты) глючат(пропускают потоки, когда главный поток блокирует), не объяснимо но факт. Может там трабла, я хз.
     
  5. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Не помню какое на XP хом эдишн стоит ограничение на использование активных TCP соединений, но не высокое.
     
  6. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    С синхронизацией все нормально. В инди проблемы в основном при использовании прокси.

    Я win2003 использую обычно )
     
  7. [stranger]

    [stranger] Member

    Joined:
    2 Feb 2010
    Messages:
    167
    Likes Received:
    29
    Reputations:
    4
    как плавно съехали с gzip.. :)
    по сабжу: что-то GZDecompressStr не хочет работать с результатом GZCompressStr.. Data Error! В чем прикол?
     
  8. nick1000

    nick1000 New Member

    Joined:
    10 May 2009
    Messages:
    25
    Likes Received:
    2
    Reputations:
    0
    Вот нашел в нете функцию позволяющую распаковывать gzip без заголовка(10 байт) и окончания (8 байт=CRC32+длинна исходного текста). На залил ру ответ без окончания.

    а вообще ошибка возникала из-за того что в TZDecompressionStream используется InflateInit_ в котором по-умолчанию стоит windowBits=15, а нужно windowBits=-15 , что и указывается в InflateInit2_
    (хотя сам адлер пишет что этот параметр должен быть в диапазоне 8..15).

    Вот код:

    Code:
    function InflateInit2(var stream: TZStreamRec; windowBits: Integer): Integer;
    begin
      result := InflateInit2_(stream,windowBits,ZLIB_VERSION,SizeOf(TZStreamRec));
    end;
    
    
    function ZDecompressCheck(code: Integer): Integer;
    begin
      Result := code;
    
      if code < 0 then
      begin
        raise EZDecompressionError.Create(_z_errmsg[2 - code]);
      end;
    end;
    
    procedure GZDecompress(const inBuffer: Pointer; inSize: Integer;
      out outBuffer: Pointer; out outSize: Integer; outEstimate: Integer = 0);
    var
      zstream: TZStreamRec;
      delta  : Integer;
    begin
      FillChar(zstream,SizeOf(TZStreamRec),0);
    
      delta := (inSize + 255) and not 255;
    
      if outEstimate = 0 then outSize := delta
      else outSize := outEstimate;
    
      GetMem(outBuffer,outSize);
    
      try
        zstream.next_in := inBuffer;
        zstream.avail_in := inSize;
        zstream.next_out := outBuffer;
        zstream.avail_out := outSize;
    
        ZDecompressCheck(InflateInit2(zstream, -15));
    
        try
          while ZDecompressCheck(inflate(zstream,Z_NO_FLUSH)) <> Z_STREAM_END do
          begin
            Inc(outSize,delta);
            ReallocMem(outBuffer,outSize);
    
            zstream.next_out := PAnsiChar(Integer(outBuffer) + zstream.total_out);
            zstream.avail_out := delta;
          end;
        finally
          ZDecompressCheck(inflateEnd(zstream));
        end;
    
        ReallocMem(outBuffer,zstream.total_out);
        outSize := zstream.total_out;
      except
        FreeMem(outBuffer);
        raise;
      end;
    end;
    
    
    function GZDecompressStr(const s: AnsiString): AnsiString;
    var
      buffer: Pointer;
      size  : Integer;
    begin
      GZDecompress(PChar(s),Length(s),buffer,size);
    
      SetLength(result,size);
      Move(buffer^,result[1],size);
    
      FreeMem(buffer);
    end;
    
    
    procedure TForm1.Button6Click(Sender: TObject);
    var ss,s,reply:string;
    begin
    
    Здесь получаем ответ через winsocks
    ........
        reply:=copy(reply,pos('6da',reply),1757);
     //или по-другому. Главное чтобы в reply остался '6da' . 
    
        s := Copy(reply, 11, Length(reply)-10);
        ss:=GZDecompressStr(s);
        Memo1.Text:=ss;
    end;
     
    #28 nick1000, 17 Apr 2010
    Last edited: 18 Apr 2010
    1 person likes this.
  9. Ryhor

    Ryhor New Member

    Joined:
    20 Aug 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Нашел вышеуказанные функции в ZLibExGZ, но прикрутить к моей Delphi 7 не удается, видимо модуль ориентирован на 2010 делфу, судя по используемым типам. Проблему-то решили? Тоже интересует вопрос по сабжу
     
  10. Nashev

    Nashev New Member

    Joined:
    19 Aug 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    TurboPower Abbrevia

    Для тех, кто как и я ищет решение для распаковки всяких gzip программой на Delphi - очень рекомендую обратить внимание на бесплатную библиотеку TurboPower Abbrevia (http://sourceforge.net/projects/tpabbrevia/) - на чистом паскале в виде удобных классов реализованы многие алгоритмы разархивирования, архивирования прочих операций с архивами. В том числе gzip.