Android上DecodeBase64的结果只有1个字节?

时间:2014-11-11 10:57:37

标签: android delphi firemonkey

procedure Foo;
    var str:String;byteArray:TBytes;
    begin
      str :=  'test';
      str :=  EncodeBase64(@Str[1],sizeof(Char)*length(str));
      byteArray:= DecodeBase64(str);
      showmessage(string(byteArray));
    end;

在Windows上运行会给我“测试”作为消息。在Android上我只得到“est”,“est2”或黑屏和崩溃。 Android下的调试显示byteArray只存储第一个字节。 我做错了什么或这是一个已知的问题?

EncodeBase64来自RAD-Studio XE7源的Soap.EncdDecd.pas。

1 个答案:

答案 0 :(得分:2)

Base64将二进制文件编码为文本。并且解码将文本解码为二进制。因此,从字符串开始,您需要使用一些定义良好的文本编码将文本编码为二进制。例如:

var
  bytes: TBytes;
....
bytes := TEncoding.UTF8.GetBytes(str);

现在你可以根据需要base64编码bytes二进制文件。

在相反方向,解码base64编码文本产生表示UTF-8编码文本的字节数组。像这样解码:

str := TEncoding.UTF8.GetString(bytes);

在XE7中,您不应使用Soap.EncdDecd。而是使用System.NetEncoding.TNetEncoding。调用TNetEncoding.Base64.EncodeBytesToString编码为base64,并TNetEncoding.Base64.DecodeStringToBytes进行解码。

编码:

bytes := TEncoding.UTF8.GetBytes(str);
base64 := TNetEncoding.Base64.EncodeBytesToString(bytes);

解码:

bytes := TNetEncoding.Base64.DecodeStringToBytes(base64);
str := TEncoding.UTF8.GetString(bytes);

关键信息是base64将二进制文件编码为文本。这经常被误解。