Delphi: How to encode TIdBytes to Base64 string?

12,813

Solution 1

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;

Solution 2

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))); 
Share:
12,813
jmp
Author by

jmp

0day

Updated on June 14, 2022

Comments

  • jmp
    jmp almost 2 years

    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.

  • jmp
    jmp over 12 years
    So after I receive the encoded string(base64) , is it safe to past it to DecodeBase64(AnsiString(s)) ?
  • Remy Lebeau
    Remy Lebeau over 12 years
    @waza123: like this: data := TIdDecoderMIME.DecodeBytes(s);