Delphi: Как кодировать TIdBytes в строку Base64? - PullRequest
2 голосов
/ 13 декабря 2011

Как закодировать 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 :(

Или как отправить AnsiString через AContext.Connection.Socket.Write ()?

Поговорка компилятора Неявное приведение строки из 'AnsiString' к 'string'

Переменная «data» содержит данные UTF-8 с веб-сайта.

Ответы [ 2 ]

6 голосов
/ 13 декабря 2011

Вы можете использовать класс Indy TIdEncoderMIME для кодирования данных String, TStream и TIdByte в base64 (и TIdDecoderMIME для декодирования из base64 обратно в String, TStream или TIdBytes), например:

s := TIdEncoderMIME.EncodeBytes(data);

Что касается отправки AnsiString данных, Indy в D2009 + просто не имеет никаких перегрузок 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 в 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;
3 голосов
/ 13 декабря 2011

В более поздних версиях Delphi со строкой Unicode в качестве значения по умолчанию ... вы можете спокойно приводить возвращаемое значение в виде String, чтобы избавиться от этого предупреждения.Base64 возвращает только небольшой набор значений (ascii) ..., который никогда не приведет к потере данных при преобразовании в Unicode.

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