C++でBase64エンコード・デコードを行うコード

http://www2s.biglobe.ne.jp/~satosi/soft/base64/base64.h
http://www2s.biglobe.ne.jp/~satosi/soft/base64/base64.cpp


使い方1:
ファイル単位で行うには

map.gifをbase64エンコードして, d.txt へ出力

base64::Encode("map.gif","d.txt");


d.txtはbase64エンコード済みで,それをデコードして
ファイル名map.gifに保存する

base64::Decode("d.txt","map.gif");


使い方2:
メモリの中のものをbase64のエンコードでコードする

char buf[60] ;
char *str = "1234";
cout << str << endl;

base64 b64;
strcpy(buf,b64.Encode(str)); // strをbase64エンコードしてものbufへコピー
cout << buf << endl;

cout char *p = b64.Decode(buf); // bufをbase64デコードして,pに設定
cout << p << endl;

使い方3:
ストリームで処理する。
base64 b64;
ifstream ifs("input.dat"); // 入力ファイル
ofstream ofs("output.dat"); // 出力ファイル
base64::Encode(ifs, ofs); // base64エンコード処理

//base64::Decode(ifs, ofs); // base64デコード処理

ストリームは,sstream とかを使うと,ファイルから変換しながらメモリへ読み込んだり,メモリから変換しながらファイルへ書き出したりすることが出来る。

Windowsとかでは,
 エンコードする時(通常ファイル→Base64化したファイル)
  入力ファイル:バイナリモードで開く。
  出力ファイル:テキストモードで開く。(ノーマルモード)

 デコードする時(Base64化したファイル→通常ファイル)
  入力ファイル:テキストモードで開く。(ノーマルモード)
  出力ファイル:バイナリモードで開く。

にしないと,動作が変になる。(\r\n が \n に変換されてしまいます。)
具体的には,「C++のストリーム・ファイル入出力 streamとfstream」
http://sato-si.at.webry.info/200703/article_1.html
を参照してください。

この記事へのコメント

okp
2008年07月10日 12:49
プログラム使わせていただいてます!ありがとうございます。
const char *base64::Encode(const char *szStr, int iLens)
の中にあるswitchですが、

case 0:lpszOutputString[j] = '\0';break;

が必要ではないでしょうか?エンコード後文字列の末尾にゴミがつくようです。
同様に、ストリーム向けencodeも末尾にゴミがつくようです。
dombly
2013年01月29日 13:20
>ストリーム向けencodeも末尾にゴミがつく

77行目 i_str.read(c,3);

のあとに

if (istr.gcount() == 0) break;

を入れることで回避できました。ご参考まで。

この記事へのトラックバック