Base64到二进制(Delphi)

时间:2012-01-07 09:26:45

标签: delphi

我使用了Binary到你回答的Base64功能: Binary to Base64 (Delphi)

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

再次将此文件写入磁盘

5 个答案:

答案 0 :(得分:15)

大卫一如既往地回答。虽然我无法抗拒使用最近的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;

答案 1 :(得分:6)

此函数将采用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;

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

bytes := DecodeBase64(base64);

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

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

stream := TFileStream.Create(FileName, fmCreate);

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

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

if bytes<>nil then
  stream.Write(bytes[0], Length(Bytes));

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

答案 2 :(得分:1)

uses
  Soap.EncdDecd;

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

function TForm1.DecodeFile(const base64: AnsiString): TBytesStream;
begin
 Result := TBytesStream.Create(DecodeBase64(base64));
end;

答案 3 :(得分:0)

我有一个非常旧的Delphi2006(v10.0.2558.35231更新2),并且必须解码base64 UTF8编码的输入字符串。我终于弄清楚了,并且对任何有兴趣的人都是一个例子。

  Uses
    IdCoderMIME; // Indy9
  var
    decoder: TIdDecoderMIME;
    str: WideString;
  - - - 

  decoder := TIdDecoderMIME.Create(nil);
  str := base64DecodeUTF8(decoder, b64sourcestr);
  decoder.Free;
  - - - 

  function base64DecodeUTF8(decoder:TIdDecoderMIME; str:String): WideString;
  var
    stream:TMemoryStream;
    utf8: UTF8String;
    //idx:Integer;
  begin
    stream := TMemoryStream.Create;
    try
      decoder.DecodeToStream(str, stream);
      setString(utf8, PChar(stream.Memory), stream.Size);
      Result := UTF8Decode(utf8);
      //for idx := 0 to stream.Size-1 do begin
      //  Writeln(PChar(stream.Memory)[idx] + ' ' + IntToStr(ORD(PChar(stream.Memory)      [idx])) );
      //end;
    finally
      stream.Free;
    end;
  end;

答案 4 :(得分:0)

在研究Soap.EncdDecd之后,可以找到更多与平台无关的方式,因为它的DecodeBase64使用System.NetEncoding中的通用(无AnsiString)方法。

基于Uwe的样本:

uses
  ...
  System.Classes,
  System.NetEncoding;

...
procedure DecodeFile(const base64: String; const FileName: string);
var
  stream: TBytesStream;
begin
  stream := TBytesStream.Create(TNetEncoding.Base64.DecodeStringToBytes(base64));
  try
    stream.SaveToFile(Filename);
  finally
    stream.Free;
  end;
end;