istreambuf_iterator
キーを上手く割出すことができて早速解読!と思ったらどうもおかしい。
1.1.1の解答編にあるxorer.cをC++で書き直してみたけど途中からおかしくなる。
調べてみたらistream_iteratorが空白を無視することが原因だった。
こういうときはistreambuf_iteratorを使えばいいのか。勉強になった。
(Effective STL―STLを効果的に使いこなす50の鉄則 第29項)
#include#include #include #include using namespace std; struct do_xor{ do_xor(const char *key) :key_(key), pos_(key) {} char operator()(const char in){ if(!*pos_) pos_ = key_; return in ^ *(pos_++); } private: const char *pos_; const char *key_; }; int main(int argc, char *argv[]){ if(argc != 4){ cerr << "Usage: xorer " << endl; return 1; } const char *key = argv[1]; cout << "key:" << key << endl; ifstream fin(argv[2], ios::binary); if(fin.fail()) return 1; ofstream fout(argv[3], ios::binary | ios::trunc); if(fout.fail()) return 1; transform(istreambuf_iterator (fin), istreambuf_iterator (), ostream_iterator (fout), do_xor(key)); return 0; }
次の「1.1.3 文通する有名人」はetaoin shrdluだろうな。これは違う言語でやってみよう。