これは、私がほとんど行ってきたより大きな課題の一部ですが、この部分を除いて、紙の上では本当に単純に聞こえるので、少し恥ずかしいです。
つまり、基本的に、私は大量の圧縮データを持っています。私は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を使用したいと思います。