libbzip2を使ってみました.
Minimum Description Length(MDL)なんかを使ってきましたが,Normarized Compression Distance(NCD)なんかを使ってみようと思い,bzip2のプログラムをしてみました.
bzip2
Ruby用のインターフェースも出ているようですが,とりあえずlibbzip2をそのまま使ってみました.思ったより使いやすいのですが,C++でプログラムしようと思うと,クラス化されていないlibbzip2を操るのに少々工夫が必要でした.何より,サンプルにバグがある(笑).
例えば,3.4.9. Standard file-reading/writing codeを修正してコンパイルしても,そのままでは動きません.
圧縮してファイルを書き込む1番目のサンプルにしても,
b = BZ2_bzWriteOpen( &bzerror, f, 9 );
の行,引数の数が全然違います.これは適当に
int blockSize100k;
int verbosity;
int workFactor;
blockSize100k = 5;
verbosity = 4;
workFactor = 30;
なんて宣言を加えて,
b = BZ2_bzWriteOpen(&bzerror, f, blockSize100k, verbosity, workFactor );
とすればOK.
不覚にもハマってしまったのがこの行.
nWritten = BZ2_bzWrite ( &bzerror, b, buf, nBuf );
これは
BZ2_bzWrite ( &bzerror, b, buf, nBuf );
とすればOK. BZ2_bzWriteって,戻り値はvoidでした...堂々と書き込みバイト数を返すかのようなコードになっているので...余りの堂々さに気づくのが遅れました.
なんだかんだ言って,わりとシンプルで面白いです.libpngなんて,結構複雑だったような...