type
TByteArray = array of Byte;
function DecodeBase64(const s:string;Strict:boolean=false):TByteArray;overload;
var
Instream : TStringStream;
Outstream : TMemoryStream;
Decoder : TBase64DecodingStream;
begin
Instream:=TStringStream.Create(s);
try
Outstream:=TMemoryStream.Create;
try
if strict then
Decoder:=TBase64DecodingStream.Create(Instream,bdmStrict)
else
Decoder:=TBase64DecodingStream.Create(Instream,bdmMIME);
try
Outstream.CopyFrom(Decoder,Decoder.Size);
SetLength(Result,Outstream.Size);
Outstream.Position := 0;
Move(Outstream.Memory^,Result[0], Outstream.Size);
//Result:=Outstream.DataString;
finally
Decoder.Free;
end;
finally
Outstream.Free;
end;
finally
Instream.Free;
end;
end;
function DecodeBase64(const s;const aSize:LongInt; Strict:boolean=false):TByteArray;overload;
var
Instream : TMemoryStream;
Outstream : TMemoryStream;
Decoder : TBase64DecodingStream;
begin
Instream:=TMemoryStream.Create;//(s);
try
Outstream:=TMemoryStream.Create;
try
Instream.WriteBuffer(s,aSize);
Instream.Position := 0;
if strict then
Decoder:=TBase64DecodingStream.Create(Instream,bdmStrict)
else
Decoder:=TBase64DecodingStream.Create(Instream,bdmMIME);
try
Outstream.CopyFrom(Decoder,Decoder.Size);
SetLength(Result,Outstream.Size);
Outstream.Position := 0;
Move(Outstream.Memory^,Result[0], Outstream.Size);
//Result:=Outstream.DataString;
finally
Decoder.Free;
end;
finally
Outstream.Free;
end;
finally
Instream.Free;
end;
end;
procedure TForm1.Button1Click(Sender :TObject);
//replace the const section with {$I data.inc} for testing
const
cData = '7EFBZP6kPw==';
var
vData :TByteArray;
vStr :String;
vCntr :Integer;
begin
vData := DecodeBase64(cData[1],Length(cData));//expected result EC,41,41,64,FE,A4,3F
for vCntr := low(vData) to High(vData) do
vStr := vStr + IntToHex(Byte(vData[vCntr]),2)+',';
SetLength(vStr,Length(vStr)-1);
ShowMessage(vStr);
end;