二进制转Base64(Delphi)

22

我该如何获取一个exe文件的内容并将其转换为Base64编码?

编辑

我使用D2010,我想知道这究竟是如何实现的?

  • 打开一个exe文件
  • 将其内容转换为base64
3个回答

66

在Delphi 2009/2010/XE中有一个单元EncdDecd.pas (对于Delphi XE2是Soap.EncdDecd.pas),其中包含函数EncodeBase64DecodeBase64。您可以将exe文件加载到内存流中,然后调用EncodeBase64。

function EncodeFile(const FileName: string): AnsiString;
var
  stream: TMemoryStream;
begin
  stream := TMemoryStream.Create;
  try
    stream.LoadFromFile(Filename);
    result := EncodeBase64(stream.Memory, stream.Size);
  finally
    stream.Free;
  end;
end;

5
对于使用古老的Delphi版本的人,等效函数可在Indy的Mime编码工具中找到。 - Warren P
2
@Warren:具体而言,Indy的IdCoderMIME单元包含启用base64的类。 - Remy Lebeau
3
对于那些使用较旧版本的Delphi的人,还可以使用Crypt32.dll(WinXP+)中的CryptBinaryToString函数。 - Ken Bourassa
9
请注意,EncdDecd.pas单元中的EncodeBase64函数将在每75个base64编码的字符后插入2个AnsiChar (#$D#$A == CRLF)。您无法告诉它不要这样做。至少java版本有一个布尔值来控制是否需要这个额外的“智能”功能。希望这有所帮助。 - drakorg
5
在后续版本的 Delphi 中(不确定从哪个版本开始):uses System.NetEncoding; TNetEncoding.Base64.EncodeBytesToString(Stream.Memory, Stream.Size) - Dave Nottage
显示剩余6条评论

9
在古老的Delphi版本中,您可以使用synapse (链接在此处)。只需将synacode.pas放入您的uses中并调用EncodeBase64/EncodeBase64函数即可。祝好!

1
Synapse不随任何版本的Windows一起提供。也许你指的是Indy? - Marco van de Voort
@Marco van de Voort。不,我是指synapse。看一下链接。 - Rod Lima
不好意思,我的意思是 Synapse 没有与 Delphi 打包在一起,而 Indy 是有的。 - Marco van de Voort

0

正如评论中提到的那样,自 Delphi XE8 起,您可以使用 System.NetEncoding.TNetEncoding.Base64 类属性。
它还返回一个 string 而不是一个 AnsiString

function TryEncodeFile(const AFileName: string; out ABase64string: string): Boolean;
var
  MemStream: TMemoryStream;
begin
  MemStream := TMemoryStream.Create;
  try
    MemStream.LoadFromFile(AFileName);
    ABase64string :=
      TNetEncoding.Base64.EncodeBytesToString(MemStream.Memory, MemStream.Size);
    Result := True;
  finally
    MemStream.Free;
  end;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接