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。
答案 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将二进制文件编码为文本。这经常被误解。