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

时间:2011-12-13 04:19:04

标签: string delphi 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 :(

或者如何通过AContext.Connection.Socket.Write()发送AnsiString?

编译器说从'AnsiString'到'string'的隐式字符串

“data”变量包含来自网站的UTF-8数据。

2 个答案:

答案 0 :(得分:6)

您可以使用Indy的TIdEncoderMIME类将StringTStreamTIdByte数据编码为base64(和TIdDecoderMIME以从base64解码回{ {1}},StringTStream),例如:

TIdBytes

至于发送s := TIdEncoderMIME.EncodeBytes(data); 数据,D2009 +中的Indy根本没有任何AnsiString重载来处理TIdIOHandler.Write()数据,只有AnsiString数据。要按原样发送UnicodeString,您可以:

1)使用AnsiStringAnsiString复制到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)));