将Base64编码的字符串转换为二进制文件

3
我有一个包含PDF数据的Base64编码字符串。使用EncdDecd单元,我可以将该字符串解码为字节数组。
这就是我遇到问题的地方:我尝试将字符保存到一个字符串中,但一旦遇到零值(ASCII=0#0$00),该字符串就不再追加。例如:
uses
  EncdDecd;
var
  EncodedString : String;
  Report : String;
  Base64Bytes: TBytes; // contains the binary data
begin
  Base64Bytes := DecodeBase64(EncodedString);
  for I := 0 to Length(Base64Bytes) - 1 do
    begin
      Report := Report + Chr(Base64Bytes[I]);
    end;

将文本写入文件似乎效果更好,但是将其重命名为 .PDF 后文件无法正确打开。
如何在 Delphi 中写入二进制文件?或者将数据保存到流中?基本上我只是试图将编码字符串保存到 PDF/二进制文件中,或在 Delphi 中显示 PDF。
我找了很多信息,在 使用 Delphi 2007 将 Base64 字符串保存到磁盘中的二进制 中找到了一个可能的解决方案,但还有其他方法吗?

2
重复的问题:在Delphi 2007中将Base64字符串保存为二进制文件。我不明白你在这里请求什么信息。如果你只是想要更多的选项,它们应该作为原始问题的答案,而不是这个重复的问题。 - Rob Kennedy
你尝试了什么?问题出在哪里?如何“追加”字符串?请使用“EncdDecd命名空间”发布您的代码。另外,如何将文本文件更改为PDF?再次发布您的代码。在Delphi中有许多方法可以转换字符串并将其保存为二进制文件。您发布的链接是一个相当紧凑的代码来完成它。 - PA.
1个回答

9
这应该可以解决问题:
procedure DecodeBaseToFile(const FileName: string; 
  const EncodedString: AnsiString);
var
  bytes: TBytes;
  Stream: TFileStream;
begin
  bytes := DecodeBase64(EncodedString);
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    if bytes<>nil then
      Stream.WriteBuffer(bytes[0], Length(bytes));
  finally
    Stream.Free;
  end;
end;

注意:以下内容仅为我在脑海中编译的。


@Trevor:你也可以使用TByteStream。它是TMemoryStream的子类,因此具有可用的SaveToFile()方法。这样,你就不必手动实例化TFileStream了。 - Remy Lebeau
@Trevor:我已经为你点赞了,但你必须自己接受它作为答案(在上下投票箭头下方勾选)。 - Marjan Venema
我创建了一个空的单元,在uses中需要使用System.Classes、System.SysUtils、synacode、IdCoder和IdCoderMIME;我需要将Decodebase64这一行更改为bytes := TIdDecoderMIME.DecodeBytes(EncodedString); - Márcio Rossato
1
@MárcioRossato 这是使用不同的base64编码器。 - David Heffernan
是的,我需要进行更改,因为我还没有找到正确的用法。 - Márcio Rossato

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