XE7中的Base64编码单元被放到了System.NetEncoding里,但它的默认实现时,会每76个字符加一个换行,先看TNetEncoding的Base64属性的读取函数实现:
class function TNetEncoding.GetBase64Encoding: TNetEncoding;
var
LEncoding: TBase64Encoding;
begin
if FBase64Encoding = nil then
begin
LEncoding := TBase64Encoding.Create;
if AtomicCmpExchange(Pointer(FBase64Encoding), Pointer(LEncoding), nil) <> nil then
LEncoding.Free;
{$IFDEF AUTOREFCOUNT}
FBase64Encoding.__ObjAddRef;
{$ENDIF AUTOREFCOUNT}
end;
Result := FBase64Encoding;
end;OK,我们可以看它它创建了一个TBase64Encoding的默认实例,使用的是默认构造函数。而默认构造函数我们看下:
constructor TBase64Encoding.Create; begin Create(kCharsPerLine, sLineBreak); end; constructor TBase64Encoding.Create(CharsPerLine: Integer); begin Create(CharsPerLine, sLineBreak); end; constructor TBase64Encoding.Create(CharsPerLine: Integer; LineSeparator: string); begin FCharsPerline := CharsPerLine; FLineSeparator := LineSeparator; end;
我们看到了一个kCharsPerLine和sLineBreak两个参数。再进一步到内部编码单元(580行)有下面一段代码:
if (FCharsPerLine > 0) and (State.StepCount >= FCharsPerLine/4) then
begin
Move(LineSeparator[0], POut^, Length(LineSeparator));
Inc(POut, Length(LineSeparator));
State.StepCount := 0;
end;我们看到它会自动添加了换行符。我们看下kCharsPerLine的定义:
const
kCharsPerLine = 76;所以,如果我们不要编码结果中存在换行符,那么我们就不应该使用默认的TNetEncoding.Base64实例来进行Base64编码,而是要自己创建一个TBase64Encoding实例来实现,参考代码如下:
procedure TForm1.Button1Click(Sender: TObject); var AEncoding:TBase64Encoding; ... begin AEncoding:=TBase64Encoding.Create(MaxInt); Edit2.Text := AEncoding.EncodeBytesToString(...); FreeAndNil(AEncoding); end;
