waz*_*123 2 delphi string base64 ansistring
如何将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 :(
Run Code Online (Sandbox Code Playgroud)
或者如何通过AContext.Connection.Socket.Write()发送AnsiString?
编译器说从'AnsiString'到'string'的隐式字符串转换
"data"变量包含来自网站的UTF-8数据.
您可以使用Indy的TIdEncoderMIME类编码String,TStream和TIdByte数据为base64(并TIdDecoderMIME从解码的base64回String,TStream或TIdBytes),例如:
s := TIdEncoderMIME.EncodeBytes(data);
Run Code Online (Sandbox Code Playgroud)
至于发送AnsiString数据,D2009 +中的Indy根本没有TIdIOHandler.Write()处理AnsiString数据的任何重载,只有UnicodeString数据.要发送AnsiString原样,您可以:
1)复制AnsiString到TIdBytes使用RawToBytes()然后调用TIdIOHandler.Write(TIdBytes):
var
as: AnsiString;
begin
as := ...;
AContext.Connection.IOHandler.Write(RawToBytes(as[1], Length(as)));
end;
Run Code Online (Sandbox Code Playgroud)
2)将AnsiString数据复制到a 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;
Run Code Online (Sandbox Code Playgroud)
要么:
var
as: AnsiString;
strm: TStream;
begin
as := ...;
strm := TIdMemoryBufferStream.Create(as[1], Length(as));
try
AContext.Connection.IOHandler.Write(strm);
finally
strm.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)