如何将任何类型的文件编码为base64字符串,然后使用Lazarus/Delphi将其解码为文件?

Dar*_*ski 1 delphi base64 serialization freepascal lazarus

你能告诉我怎么办?是否有任何Freepascal单位可以为我做这个?我需要这样,所以我的程序可以将二进制数据存储在基于XML的文件格式中.

Dav*_*nan 9

使用base64单位及其两个类,TBase64EncodingStreamTBase64DecodingStream.

这是一个简单的例子:

program demo;

uses Classes, base64;

var
  DecodedStream: TStringStream;
  EncodedStream: TStringStream;
  Encoder: TBase64EncodingStream;
  Output: string;
begin
  DecodedStream := TStringStream.Create('Hello World!');
  EncodedStream := TStringStream.Create('');
  Encoder       := TBase64EncodingStream.Create(EncodedStream);
  Encoder.CopyFrom(DecodedStream, DecodedStream.Size);

  Output := EncodedStream.DataString;
  { Outputs 'SGVsbG8gV29ybGQh' }
  WriteLn(Output);

  DecodedStream.Free;
  EncodedStream.Free;
  Encoder.Free;
end.
Run Code Online (Sandbox Code Playgroud)

并且,在相反的方向:

program demo;

uses Classes, base64;

var
  DecodedStream: TStringStream;
  EncodedStream: TStringStream;
  Decoder: TBase64DecodingStream;
  Output: string;
begin
  EncodedStream := TStringStream.Create('SGVsbG8gV29ybGQh');
  DecodedStream := TStringStream.Create('');
  Decoder       := TBase64DecodingStream.Create(EncodedStream);
  DecodedStream.CopyFrom(Decoder, Decoder.Size);

  Output := DecodedStream.DataString;
  { Outputs 'Hello World!' }
  WriteLn(Output);

  DecodedStream.Free;
  EncodedStream.Free;
  Decoder.Free;
end.
Run Code Online (Sandbox Code Playgroud)

或者shorthands encodestringbase64decodestringbase64(2.4.4+)用于非基于流的用法:

Uses Base64;
var 
   s : AnsiString;
Begin
  s:=EncodeStringBase64('Hello world!');
  Writeln('Encoded : ',s);
  s:=DecodeStringBase64(s);
  Writeln('Decoded again : ',s);    
end.
Run Code Online (Sandbox Code Playgroud)