stringdelphibase64ansistring

Delphi: How to encode TIdBytes to Base64 string?


How to encode TIdBytes to Base64 string (not 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 :(

Or how to send AnsiString via AContext.Connection.Socket.Write() ?

Compiler saying Implicit string cast from 'AnsiString' to 'string'

"data" variable contains UTF-8 data from website.


Solution

  • You can use Indy's TIdEncoderMIME class to encode String, TStream, and TIdByte data to base64 (and TIdDecoderMIME to decode from base64 back to String, TStream, or TIdBytes), eg:

    s := TIdEncoderMIME.EncodeBytes(data);
    

    As for sending AnsiString data, Indy in D2009+ simply does not have any TIdIOHandler.Write() overloads for handling AnsiString data at all, only UnicodeString data. To send an AnsiString as-is, you can either:

    1) copy the AnsiString into a TIdBytes using RawToBytes() and then call TIdIOHandler.Write(TIdBytes):

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

    2) copy the AnsiString data into a TStream and then call 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;
    

    Or:

    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;