如何将TIdBytes编码为Base64字符串(不是AnsiString)?
ASocket.IOHandler.CheckForDataOnSource(5);
if not ASocket.Socket.InputBufferIsEmpty then
begin
ASocket.Socket.InputBuffer.ExtractToBytes(data);
// here I need to encode data to base64 string, how ? I don't need AnsiString!!
// var s:string;
s := EncodeBase64(data, Length(data)); // but it will be AnsiString :(
或者如何通过AContext.Connection.Socket.Write()发送AnsiString?
编译器说从'AnsiString'到'string'的隐式字符串
“data”变量包含来自网站的UTF-8数据。
答案 0 :(得分:6)
您可以使用Indy的TIdEncoderMIME
类将String
,TStream
和TIdByte
数据编码为base64(和TIdDecoderMIME
以从base64解码回{ {1}},String
或TStream
),例如:
TIdBytes
至于发送s := TIdEncoderMIME.EncodeBytes(data);
数据,D2009 +中的Indy根本没有任何AnsiString
重载来处理TIdIOHandler.Write()
数据,只有AnsiString
数据。要按原样发送UnicodeString
,您可以:
1)使用AnsiString
将AnsiString
复制到TIdBytes
,然后拨打RawToBytes()
:
TIdIOHandler.Write(TIdBytes)
2)将var
as: AnsiString;
begin
as := ...;
AContext.Connection.IOHandler.Write(RawToBytes(as[1], Length(as)));
end;
数据复制到AnsiString
,然后拨打TStream
:
TIdIOHandler.Write(TStream)
或者:
var
as: AnsiString;
strm: TStream;
begin
strm := TMemoryStream.Create;
try
strm.WriteBuffer(as[1], Length(as));
AContext.Connection.IOHandler.Write(strm);
finally
strm.Free;
end;
end;
答案 1 :(得分:3)
在Delphi的后续版本中,默认情况下使用Unicode字符串...您应该可以安全地将返回值强制转换为字符串以摆脱警告。 Base64只返回一小组值(ascii)...在转换为Unicode时永远不会导致数据丢失。
s := String(EncodeBase64(data, Length(data)));