Top / Programming / C++Builder / Base64エンコード・デコード

Base64エンコード・デコード

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);