Как декодировать 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.