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

℡╲_俬逩灬. 提交于 2019-12-29 08:19:11

问题


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:


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.


来源:https://stackoverflow.com/questions/10242580/how-to-encode-file-of-any-type-into-base64-string-and-then-decode-it-into-file-a

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!