Base64エンコード・デコードする機能は、Indyコンポーネントで提供されています。
Base64のエンコードにはTIdEncoderMIME、デコードにはTIdDecoderMIMEを使います。
文字列をエンコード・デコードする場合。
//文字列のエンコード
AnsiString Src = "こんにちは、世界";
AnsiString Ret = IdEncoderMIME1->Encode(Src);
// Ret == "grGC8YLJgr+CzYFBkKKKRQ=="
//文字列のデコード
AnsiString Src = "grGC8YLJgr+CzYFBkKKKRQ==";
AnsiString Ret = IdDecoderMIME1->DecodeToString(Src);
// Ret == "こんにちは、世界";
バイナリをエンコード・デコードする場合は、TStreamを使用します。
//TStreamからエンコード
TFileStream* fs = new TFileStream(FileName, fmOpenRead);
AnsiString Ret = IdEncoderMIME1->Encode(fs, fs->Size);
delete fs;
//TStreamにデコード
AnsiString Ret = 〜; //エンコードされた文字列
TFileStream* fs = new TFileStream(FileName, fmCreate);
IdDecoderMIME1->DecodeToStream(Ret, fs);
delete fs;
追記
TStreamからエンコードするとき、データサイズが3の倍数である必要があるようです。
末尾に \0 を追加してサイズを調整します。
std::auto_ptr<TMemoryStream> ms(new TMemoryStream());
bmp->SaveToStream(ms.get()); //ビットマップ画像をストリームに保存
if (ms->Size % 3 != 0) //サイズが3の倍数でないとき
{
char c[3];
ZeroMemory(c, 3);
ms->Seek(0, soFromEnd); //末尾に \0 を追加する
ms->Write(c, 3 - ms->Size % 3;); //3の倍数になるように
}
std::auto_ptr<TIdEncoderMIME> mime(new TIdEncoderMIME(NULL));
AnsiString Ret = mime->Encode(ms.get(), ms->Size);