Question

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.

Was it helpful?

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;

OTHER TIPS

In later versions of Delphi with Unicode string as the default...you should be safe to simply cast the return value as a String to rid yourself of that warning. Base64 only returns a small set of values (ascii) ... which will never lead to data loss in conversion to Unicode.

s := String(EncodeBase64(data, Length(data))); 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top