How to encode file of any type into base64 string and then decode it into file again using Lazarus/Delphi?

后端 未结 1 1743
后悔当初
后悔当初 2020-12-20 07:21

Can you tell me how can I do that? Is there any Freepascal unit that can do this for me? I need that so my program can store binary data in it\'s XML-based fileformat.

相关标签:
1条回答
  • 2020-12-20 08:16

    Use the base64 unit and its two classes, TBase64EncodingStream and TBase64DecodingStream.

    Here is a simple example:

    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.
    

    And, in the opposite direction:

    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.
    

    or the shorthands encodestringbase64 and decodestringbase64 (2.4.4+) for non stream based usage:

    Uses Base64;
    var 
       s : AnsiString;
    Begin
      s:=EncodeStringBase64('Hello world!');
      Writeln('Encoded : ',s);
      s:=DecodeStringBase64(s);
      Writeln('Decoded again : ',s);    
    end.
    
    0 讨论(0)
提交回复
热议问题