【问题标题】:Delphi: How to encode TIdBytes to Base64 string?Delphi:如何将 TIdBytes 编码为 Base64 字符串?
【发布时间】:2012-01-19 00:50:00
【问题描述】:

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

【问题讨论】:

  • 也许还有其他方法可以将二进制数据传递给字符串?这将比 base64 编码具有更高的性能..
  • 编译器告诉我可能有数据丢失
  • 在变量“数据”中我有来自网站的 UTF-8 数据。
  • 好的,如果我尝试发送 ansistring AContext.Connection.Socket.Write(s);编译器说:W1057 Implicit string cast from 'AnsiString' to 'string'

标签: string delphi base64 ansistring


【解决方案1】:

您可以使用 Indy 的 TIdEncoderMIME 类将 StringTStreamTIdByte 数据编码为 base64(以及将 TIdDecoderMIME 从 base64 解码回 StringTStream 或 @987654328 @),例如:

s := TIdEncoderMIME.EncodeBytes(data);

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

1) 使用RawToBytes()AnsiString 复制到TIdBytes,然后调用TIdIOHandler.Write(TIdBytes)

var
  as: AnsiString;
begin
  as := ...;
  AContext.Connection.IOHandler.Write(RawToBytes(as[1], Length(as)));
end;

2) 将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;

或者:

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;

【讨论】:

  • @waza123:像这样:data := TIdDecoderMIME.DecodeBytes(s);
【解决方案2】:

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

s := String(EncodeBase64(data, Length(data))); 

【讨论】:

  • 所以在我收到编码的字符串(base64) 后,将它传递给 DecodeBase64(AnsiString(s)) 是否安全?
猜你喜欢
  • 2010-09-19
  • 2015-06-04
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多