这是一个更大的任务的一部分,除了这一部分,我已经完成了大部分任务,这有点尴尬,因为它在纸上听起来真的很简单。
所以基本上,我有大量的压缩数据。我一直在使用 CRC32 跟踪长度
CRC32 checksum = new CRC32();
...
//read input into buffer
checksum.update(buff, 0, bytesRead);
因此,每次读入更多信息时它都会更新。我还使用以下方法跟踪解压缩长度
uncompressedLength += manage.read(buff);
所以它是一个 int 值,它具有原始文件的字节数。这是一个小的 Endian 机器。
据我所知,我需要的是我使用的四字节 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。我有一个变量 uncompressedLength,它是一个 int。我想我只需要将它转换为字节就可以了?
我一直在对 gzip 的结果和我的程序的结果进行 hexdump,我的标题和数据是正确的,我只是错过了我的预告片。
至于我为什么要手动执行此操作,那是因为分配。相信我,如果可以的话,我很想使用 GZIPOoutputStream。