Показать сообщение отдельно

  #28  
Старый 17.04.2010, 20:48
nick1000
Новичок
Регистрация: 10.05.2009
Сообщений: 8
Провел на форуме:
285610

Репутация: 5
По умолчанию

Вот нашел в нете функцию позволяющую распаковывать gzip без заголовка(10 байт) и окончания (8 байт=CRC32+длинна исходного текста). На залил ру ответ без окончания.

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

Вот код:

Код:
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;

Последний раз редактировалось nick1000; 18.04.2010 в 19:07..
 
Ответить с цитированием