Base64到二进制(Delphi)

use*_*768 3 delphi

我使用Binary到你回答的Base64函数: 二进制到Base64(Delphi)

我成功地将文件编码为base64字符串并将其写入MsSQL2008数据库,但我想问一个问题:如何使用EncdDecd.pas再次将此文件写入磁盘?

Uwe*_*abe 16

一如既往,大卫回答得很充分.虽然我无法抗拒使用最近的Delphi版本的一些好东西给出一个稍微不同的解决方案.

procedure DecodeFile(const base64: AnsiString; const FileName: string);
var
  stream: TBytesStream;
begin
  stream := TBytesStream.Create(DecodeBase64(base64));
  try
    stream.SaveToFile(Filename);
  finally
    stream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • +1这是一种更干净的方法.请继续不抗拒提供替代和更好答案的诱惑!! (5认同)

Dav*_*nan 7

此函数将采用base64编码的字符串,对其进行解码,并将生成的字节数组写入文件.

procedure DecodeToFile(const base64: AnsiString; const FileName: string);
var
  stream: TFileStream;
  bytes: TBytes;
begin
  bytes := DecodeBase64(base64);
  stream := TFileStream.Create(FileName, fmCreate);
  try
    if bytes<>nil then
      stream.Write(bytes[0], Length(Bytes));
  finally
    stream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

要解释这里发生的事情,第一行

bytes := DecodeBase64(base64);
Run Code Online (Sandbox Code Playgroud)

执行解码并在TBytes变量中返回文件的解码二进制内容.TBytes只是一个字节数组.

下一步是创建文件.在Delphi中编写文件的惯用方法是使用流.在这种情况下,我们想要一个TFileStream.

stream := TFileStream.Create(FileName, fmCreate);
Run Code Online (Sandbox Code Playgroud)

fmCreate选项意味着如果文件已经存在,它将被我们编写的内容替换和覆盖.

最后一步是将字节数组的内容写入文件

if bytes<>nil then
  stream.Write(bytes[0], Length(Bytes));
Run Code Online (Sandbox Code Playgroud)

if bytes<>nil检查是处理其中的base64串解码为空数组的情况.如果我们要删除该检查,那么如果您在启用范围检查(您应该这样做)的情况下运行,则以下行将导致运行时错误.呼吁stream.Write应该是不言自明的.