Delphi:如何将TIdBytes编码为Base64字符串?

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数据.

Rem*_*eau 6

您可以使用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)