1

これは、私がほとんど行ってきたより大きな課題の一部ですが、この部分を除いて、紙の上では本当に単純に聞こえるので、少し恥ずかしいです。

つまり、基本的に、私は大量の圧縮データを持っています。私はCRC32を使用して長さを追跡してきました

CRC32 checksum = new CRC32();
...
//read input into buffer
checksum.update(buff, 0, bytesRead);

したがって、より多くの情報が読み込まれるたびに更新されます。また、以下を使用して解凍長を追跡しました。

uncompressedLength += manage.read(buff);

したがって、元のファイルのバイト数を持つint値です。これは小さなエンディアンマシンです。

私の知る限り、必要なのは4バイトのCRCで、これを使用しました。

public byte[] longToBytes(long x) {
    ByteBuffer buffer = ByteBuffer.allocate(8);
    buffer.putLong(x);
    return buffer.array();
}

byte[] c = longToBytes(checksum.getValue());

しかし、これは8バイトです。CRC32.getValueはlongを返します。この場合、必要な情報を失うことなく、intに変換できますか?

そして、ISIZEは... 2^32を法とする4バイトの圧縮された長さであると想定されます。intである変数uncompresedLengthがあります。私はそれをバイトに変換する必要があると思います、そしてそれはすべてですか?

gzipからの結果とプログラムからの結果をhexdumpしてきましたが、ヘッダーとデータは正しいのですが、トレーラーがありません。

私がこれを手動で行っている理由は、割り当てによるものです。信じてください。できればGZIPOoutputStreamを使用したいと思います。

4

2 に答える 2

1

CRC32には32ビットがあります...longスーパーインターフェイスのためにクラスが戻ります。

long現在、2Gを超えるファイルは珍しくないため、非圧縮の長さはである必要があります。

したがって、どちらの場合も、longの下位32ビットを4バイトに変換する必要があります。

static byte[] lower4bytes(long v)
{
    return new byte[] {
            (byte)(v    ),
            (byte)(v>> 8),
            (byte)(v>>16),
            (byte)(v>>24)
    };
}
于 2012-10-28T23:12:07.370 に答える
0

リトルエンディアン形式で整数を書き込むには、単純に整数の下位バイトを書き込み (つまり、モジュロ 256 または 0xff で論理積)、それを 8 ビット下にシフトするか、256 で除算し、結果の下位バイトを書き込み、その 2 つを繰り返します。複数回。4 バイトを書き込みます。4 つしか書かないので、自動的に長さ modulo 2 32を書くことになります。

于 2012-10-28T22:52:34.733 に答える