2

如何将 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 数据。

4

2 回答 2

6

您可以使用 Indy 的TIdEncoderMIME类将 、 和 数据编码StringTStreambase64 TIdByte(并TIdDecoderMIME从 base64 解码回StringTStreamTIdBytes),例如:

s := TIdEncoderMIME.EncodeBytes(data);

至于发送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;

2)将数据复制AnsiString到 aTStream然后调用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;

或者:

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;
于 2011-12-13T06:55:42.880 回答
3

在更高版本的 Delphi 中,默认使用 Unicode 字符串......您应该安全地将返回值简单地转换为 String 以摆脱该警告。Base64 只返回一小组值(ascii)......在转换为 Unicode 时绝不会导致数据丢失。

s := String(EncodeBase64(data, Length(data))); 
于 2011-12-13T04:57:02.383 回答