我正在使用函数EncodeStream
(来自EncdDecd.pas
)以便将字节数组转换为base64字符串,但我正在获取一个包含换行符的字符串。
这是我正在使用的转换功能:
uses
EncdDecd, ...;
function EncodeBase64(AValue : TBytes) : string;
var
StreamDecoded : TMemoryStream;
StreamEncoded : TStringStream;
begin
StreamDecoded := TMemoryStream.Create;
StreamEncoded := TStringStream.Create('');
try
StreamDecoded.WriteBuffer(AValue[0], Length(AValue));
StreamDecoded.Position := 0;
EncdDecd.EncodeStream(StreamDecoded, StreamEncoded);
Result := StreamEncoded.DataString;
finally
StreamEncoded.Free;
StreamDecoded.Free;
end;
end;
这是一个简单的测试,会导致EncodeBase64
函数产生的字符串中出现新行:
var
Bts : TBytes;
begin
SetLength(Bts, 64);
Bts[0] := 241;
Bts[1] := 96;
Bts[2] := 227;
Bts[3] := 47;
Bts[4] := 91;
Bts[5] := 80;
Bts[6] := 83;
Bts[7] := 14;
Bts[8] := 103;
Bts[9] := 54;
Bts[10] := 95;
Bts[11] := 212;
Bts[12] := 116;
Bts[13] := 91;
Bts[14] := 149;
Bts[15] := 179;
Bts[16] := 34;
Bts[17] := 104;
Bts[18] := 175;
Bts[19] := 54;
Bts[20] := 187;
Bts[21] := 208;
Bts[22] := 2;
Bts[23] := 76;
Bts[24] := 110;
Bts[25] := 187;
Bts[26] := 32;
Bts[27] := 226;
Bts[28] := 138;
Bts[29] := 217;
Bts[30] := 8;
Bts[31] := 42;
Bts[32] := 8;
Bts[33] := 128;
Bts[34] := 245;
Bts[35] := 79;
Bts[36] := 63;
Bts[37] := 140;
Bts[38] := 48;
Bts[39] := 74;
Bts[40] := 83;
Bts[41] := 114;
Bts[42] := 73;
Bts[43] := 16;
Bts[44] := 97;
Bts[45] := 151;
Bts[46] := 138;
Bts[47] := 239;
Bts[48] := 12;
Bts[49] := 164;
Bts[50] := 170;
Bts[51] := 114;
Bts[52] := 170;
Bts[53] := 12;
Bts[54] := 241;
Bts[55] := 136;
Bts[56] := 105;
Bts[57] := 247;
Bts[58] := 2;
Bts[59] := 30;
Bts[60] := 125;
Bts[61] := 21;
Bts[62] := 245;
Bts[63] := 102;
ShowMessage(EncodeBase64(Bts));
end;
ShowMessage
方法显示以下结果:
8WDjL1tQUw5nNl / UdFuVsyJorza70AJMbrsg4orZCCoIgPVPP4wwSlNySRBhl4rvDKSqcqoM8Yhp 9wIefRX1Zg ==
在实际场景中,我正在将此字符串写为ini文件属性的值,并且新行导致从ini文件读回时字符串的一部分丢失(TIniFile.ReadString
读取只有第一行)。
有人可以帮我理解新行出现的原因以及在编写ini文件时应该如何管理这些字符串?
注意:
我正在测试Delphi2007。
答案 0 :(得分:2)
line feed in base64中讨论了RFC 4648。
MIME通常用作base 64编码的参考。然而, MIME没有定义" base 64"本身,而是一个基础64 内容传输编码"在MIME中使用。因此,MIME 强制限制基本64位编码数据的行长度为76 字符。 MIME继承了Privacy Enhanced Mail的编码 (PEM),声称它实际上是相同的&#34 ;;但是,PEM 使用64个字符的行长度。 MIME和PEM限制是 两者都是由于SMTP内的限制。
实现绝不能将换行添加到基本编码数据,除非 引用本文件的规范明确指示基础 编码器,用于在特定数量的字符后添加换行符。
您使用的编码器是以MIME编写的,并且每76个字符强制执行换行。
现代版本的Delphi引入了System.NetEncoding
单元,该单元现在包含base64的RTL实现。 System.NetEncoding
中的功能现在允许您禁止编码内容中的换行符。
我有几个选择,正如我所看到的那样: