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なんて,結構複雑だったような...