0

James Taylor の優れた小さな「seek-bzip2」を Windows でコンパイルできませんか? bzip2 アーカイブのインデックスを作成し、そのインデックスを使用して、アーカイブの個々のブロックへのランダム アクセスを提供できます。

これは C で書かれており、64 ビット長の long が必要で、http: //bitbucket.org/james_taylor/seek-bzip2から入手できます。

無料の Windows C コンパイラでコンパイルすることができません。

  • Borland には、必要なヘッダー ファイルがいくつかありません。
  • lcc はそれをコンパイルしますが、どの bzip2 ファイルでも「予期しない EOF」で失敗します。
  • 「-m64」フラグを削除すると、mingw はコンパイルしますが、上記の lcc と同じように失敗します。

無料のコンパイラはデバッグをあまりサポートしていないようで、MS Visual Studio はリムーバブル ハード ドライブへのインストールを拒否し、ネットブックの C および D ドライブには十分な容量がありません。


編集誰かに移植を依頼していたので、この質問を言い換えましたが、喜んで自分で移植してみます。どこから始めたらいいのかわからない。64 ビット型が一般的になる前から、C には触れていません。

4

1 に答える 1

2

デフォルトでは、stdin と stdout はテキスト モードで動作し、0A -> 0D 0A に変換されます。uncompressblock の前に、seek-bunzip のメインを _setmode stdin および stdout にバイナリとして変更する必要があります。

int main( int argc, char *argv[] )
{
    unsigned long pos = atol( argv[1] );
    int status;
    _setmode(0, _O_BINARY);
    _setmode(1, _O_BINARY);
    status = uncompressblock( 0, pos );
    if ( status )
        fprintf( stderr, "\n%s\n", bunzip_errors[-status] );
}

それは、MSVC++ 10 で私にとってはうまくいきます。他のコンパイラでは _setmode と _O_BINARY から先頭のアンダースコアを失う必要があるかもしれません - 私にはわかりません。それ以外に、次のことが必要でした。

  • unistd.h インクルードを削除
  • 追加内容:
    • micro-bunzip.h: sys/types.h
    • micro-bunzip.c: sys/types.h
    • seek-bunzip.c: sys/types.h、io.h、fnctl.h
  • micro-bunzip.h の micro-bunzip.c から get_bits、read_bunzip、および start_bunzip を前方宣言する
  • writeand lseekto _writeandを変更し_lseekます (これも MSVC のみの可能性があります)。

コマンドラインパラメーターがバイトオフセットではなくビットオフセット(つまり、最初のブロックの場合は32)であることに気付いた後、それはうまくいきました。

于 2010-12-15T16:49:20.333 に答える