delphi - 在 Delphi XE7 中使用 NetEncoding 对字符串进行 Base64 解码?

标签 delphi base64 decode delphi-xe7 utf8-decode

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

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

我收到此错误消息:

Error message

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

最佳答案

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

  1. 将 Base64 解码为二进制。
  2. 将二进制文件视为 UTF-8 编码文本。
  3. 将 UTF-8 字节解码为文本。

您的错误消息表明步骤 1 生成的二进制文件不是有效的 UTF-8。为了弄清楚为什么会这样,需要了解 Base64 编码文本的起源。

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

  1. 将一些文本编码为 UTF-8 字节。
  2. 对这些字节进行 Base 64 编码。

问题不一定出在您要解码的代码中。问题是您的解码与最初编码的过程不匹配。错误可能出在原始编码或解码中。您需要检查 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;

如您所见,我现在只能猜测。如果您想取得进展,您将了解您的数据是如何编码的。

关于delphi - 在 Delphi XE7 中使用 NetEncoding 对字符串进行 Base64 解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28669994/

相关文章:

delphi - Coco/R 可以将解析后的文件转换为字节码吗?

delphi - [x] 秒后关闭 Delphi 对话框

delphi - TVirtualDrawTree - 如何将节点放置在一行中?

delphi - FindFirst 是否应该按字母顺序返回找到的文件?

javascript - 如何对 AES 加密缓冲区进行 Base64 编码

c# - 将纯文本从文本框转换为 SHA1,然后将 Sha1 转换为基数 64 C#

java - 在java中解码编码字符串?

api - 如何使用 ffmpeg av_interleaved_write_frame() 写入 x264_encoder_encode() 生成的 NAL

python - pickle.load - EOFError : Ran out of input

python - 如何获取和解码指定到特定端口的消息