Base64使用Delphi XE7中的NetEncoding解码字符串?

时间:2015-02-23 08:59:45

标签: delphi base64 decode delphi-xe7 utf8-decode

在Delphi XE7 Update 1中,尝试在VCL程序中执行此代码时:

uses System.NetEncoding;
...
tempstring := TNetEncoding.Base64.Decode(tempstring);

我收到此错误消息:

Error message

那么如何使用NetEncoding对字符串进行base64解码?

1 个答案:

答案 0 :(得分:8)

您正在调用接受base64编码文本的Decode重载并返回一个字符串。 Decode方法的实现方式如下:

  1. 将base64解码为二进制。
  2. 将二进制文件视为UTF-8编码文本。
  3. 将UTF-8字节解码为文本。
  4. 您的错误消息表明步骤1产生的二进制文件无效UTF-8。为了弄清楚为什么需要知道base64编码文本的来源。

    您当前的代码假定发生了以下过程来创建base64编码值:

    1. 将某些文本编码为UTF-8字节。
    2. Base 64对这些字节进行编码。
    3. 问题不一定在您的代码中进行解码。问题是您的解码与最初编码的进程不匹配。故障可能在于原始编码或解码。您需要检查base64值的编码方式。是使用上述步骤编码的吗?

      如果我不得不猜测,我会怀疑原始数据实际上不是文本。我的猜测是原始数据是二进制的,即一个字节流。我怀疑你是从一些在AnsiString变量中保存二进制数据的代码开始的。看到Delphi代码以这种方式滥用字符串是很常见的。由于历史原因,似乎已经写入了AnsiString可用于保存二进制数据的传说。我想这一切都是在Delphi 2引入AnsiString并且当时没有动态数组时开始的。

      无论如何,如果您之前一直使用AnsiString来保存二进制数据,那么您应该借此机会停止这样做。例如,使用TBytes来实现此目的。在这种情况下,您将使用:

      var
        bytes: TBytes;
      ....
      bytes := TNetEncoding.Base64.DecodeStringToBytes(...);
      

      将base64值解码为二进制。

      因此,假设您拥有的base64实际上是ANSI编码的文本。然后你会像这样解码它:

      var
        bytes: TBytes;
        text: string;
      ....
      bytes := TNetEncoding.Base64.DecodeStringToBytes(...);
      text := TEncoding.ANSI.GetString(bytes);
      

      这假定您解码的机器上的主要ANSI代码页。如果您需要指定ANSI代码页,那么您可以这样写:

      var
        bytes: TBytes;
        text: string;
        Encoding: TEncoding;
      ....
      bytes := TNetEncoding.Base64.DecodeStringToBytes(...);
      Encoding := TEncoding.GetEncoding(CodePage);
      try
        text := Encoding.GetString(bytes);
      finally
        Encoding.Free;
      end;
      

      正如你所看到的,我现在沦为猜测。如果您想取得进展,您将了解数据的编码方式。