Как декодировать Base64 в Zlib в строку?

Есть строка закодированная в base64, соответственно при декодировании мы получаем массив байтов, который сжат в Zlib-e (это ответ webSocket'a), нужно вытащить строку в читаемом формате, предположительно там Json {...}

Получаю со своим кодом ошибки zlib -2, -3, -5

unit Unit1;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sMemo, sButton,
  IdBaseComponent, IdZLibCompressorBase, IdCompressorZLib, NetEncoding, synacode;

type
  TForm1 = class(TForm)
    sButton1: TsButton;
    sMemo1: TsMemo;
    IdCompressorZLib1: TIdCompressorZLib;
    procedure sButton1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

function ByteArrayToStream(const aContent: TArray<Byte>): TMemoryStream;
begin
  Result := TMemoryStream.Create;
  try
    if Length(aContent) > 0 then
      Result.WriteBuffer(aContent[0], Length(aContent));
    Result.Position := 0;
  except
    Result.Free;
    raise;
  end;
end;

function StreamToByteArray(aStream: TMemoryStream): TArray<Byte>;
begin
  if Assigned(aStream) then
  begin
    SetLength(Result, aStream.Size);
    if Length(Result) > 0 then
      Move(aStream.Memory^, Result[0], aStream.Size);
  end
  else
    SetLength(Result, 0);
end;

function MemoryStreamToString(M: TMemoryStream): string;
begin
  SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char));
end;

procedure TForm1.sButton1Click(Sender: TObject);
const str = 'eJw0yUEOgjAQBdC7/HVrCqmbuQolZIRGa0ohw6AxTe+uG3cveRUKKmfOBscf2w7qnMECqnhEFr1F1ikVjfLiDPJdf/39pMJzBA0YAu6s8c0fu8tiV07F+qfvA0wNWNMs2xFA7uLaiLG1LwAAAP//';
var
  mas: TArray<Byte>;
  mystr: string;
  MS_IN: TMemoryStream;
  MS_OUT: TmemoryStream;
begin
  mas := TBase64Encoding.Base64.DecodeStringToBytes(str);

  try
    MS_IN := TmemoryStream.Create;
    MS_OUT := TmemoryStream.Create;
    MS_IN := ByteArrayToStream(mas);
    IdCompressorZLib1.DecompressHTTPDeflate(MS_IN, MS_OUT);
    mystr := MemoryStreamToString(MS_OUT);
    smemo1.Text := mystr;
  finally
    FreeAndNil(MS_IN);
    FreeAndNil(MS_OUT);
  end;
  //IdCompressorZLib1.DecompressDeflateStream();
end;

end.

Ответы (0 шт):