使用 Delphi 原生的Base64编码(System.NetEncoding 单元) ,编码后的字符串每隔76个字符会增加一个回车换行(#13#10),这样就导致和其他语言对接的时候出现问题,特别是Base64以后再进行签名,例如MD5签名,就会导致签名不一致。回车换行不容易看到,所以查找问题比较困难。
但是Delphi自己Base64编码解码都没有问题!
Delphi 帮助是这样说的:
To use TBase64Encoding you usually do not need to create your own instance. You can use TNetEncoding.Base64 instead.
实际上,如果使用 TNetEncoding.Base64 编码后就会出现多余的回车换行,如果Base64后的字符串长度不足76,当然也不存在问题,但是超过以后就会存在增加多余的回车换行的问题。
存在回车换行问题的代码:
S := TNetEncoding.Base64.Encode(SourceStr);
如果不需要回车换行,就通过命令去掉:
S := S.Replace(#13#10,'');
这样得到的就没有回车换行的结果了。
第二种方法就是直接使用 TBase64Encoding 类:
var
LEncoding: TBase64Encoding;
begin
LEncoding := TBase64Encoding.Create(-1,'');
S := LEncoding.Encode(SourceStr);
LEncoding.Free;
end;
这样得到的结果S就不会包含回车换行。注意Create中的参数,通过源代码可以看出这样的参数是可以的,当然 Create(0)也是可以的,Create是重载。
演示程序下载(含源程序和执行程序)