The Lazarus unit base64 is correct.
try this:
var
B64: TBase64EncodingStream;
s: TFileStream;
st: TSTringStream;
TempStr: String;
ccount: integer;
begin
if OpenDialog1.Execute then
s := TFileStream.Create(OpenDialog1.FileName,fmOpenRead)
else
Exit;
st := TSTringStream.Create('');
try
B64 := TBase64EncodingStream.Create(st);
try
Memo1.Lines.Clear;
// B64.WriteBuffer(s, s.Size);
SetLength(TempStr, s.Size);
s.Read(tempStr[1], s.Size);
ccount := s.Size;
B64.Write(tempStr[1], ccount);
ShowMessage(tempstr);
Memo1.Lines.Add(st.DataString);
finally
B64.Free;
end;
finally
s.Free;
st.Free;
end;