为什么EncdDecd.EncodeStream返回一个新行?

时间:2016-11-18 14:45:04

标签: delphi encoding base64

我正在使用函数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。

1 个答案:

答案 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中的功能现在允许您禁止编码内容中的换行符。

我有几个选择,正如我所看到的那样:

  1. 编码后删除换行符。
  2. 使用不插入换行符的其他base64编码器。