使用INDY解决BASE64回车换行问题
使用DELPHI EncodeStream(),对流数据进行BASE64编译以后,每隔75个字符,就会添加回车换行符(#$D#$A),这会造成许多问题。
网上许多解决方法,是对BASE64的字符串中的回车换行符,使用ReplaceStr(str,#$D#$A,''...)替换掉回车换行符。
虽然这样可以解决问题,但多执行了操作,从而影响了程序的性能。
下面使用INDY来帮助解决问题:
INDY的BASE64编码,不会每隔75个字符,就会添加回车换行符(#$D#$A)。
uses IdCoderMIME
var IdEncoderMIME: TIdEncoderMIME;
ms := TMemoryStream.Create; IdEncoderMIME := TIdEncoderMIME.Create(nil); try TZipTools.ZipStream(stream, ms); // zip ms.Position := 0; {$IF CompilerVersion <= 15} // d7 Result := IdEncoderMIME.Encode(ms); {$ELSE} Result := IdEncoderMIME.EncodeStream(ms); {$IFEND} finally ms.Free; IdEncoderMIME.Free; end;
IdDeCoderMIME: TIdDeCoderMIME; ms := TMemoryStream.Create; IdDeCoderMIME := TIdDecoderMIME.Create(nil); try {$IF CompilerVersion <= 15} // d7 IdDeCoderMIME.DecodeToStream(str, ms); // indy9 {$ELSE} IdDeCoderMIME.DecodeStream(str, ms); // indy10 {$IFEND} ms.Position := 0; TZipTools.UnZipStream(ms, stream); // unzip finally ms.Free; IdDeCoderMIME.Free; end;