1

这是一个更大的任务的一部分,除了这一部分,我已经完成了大部分任务,这有​​点尴尬,因为它在纸上听起来真的很简单。

所以基本上,我有大量的压缩数据。我一直在使用 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。

4

2 回答 2

1

longCRC32 有 32 位...由于超级接口,该类返回。

未压缩的长度应该是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

要以 little-endian 形式写入整数,只需写入整数的低字节(即模 256 或与 0xff 与),然后将其向下移动 8 位或除以 256,然后写入得到的低字节,并重复这两个更多次。您将写入四个字节。由于您只写了四个,因此您将自动编写长度模 2 32

于 2012-10-28T22:52:34.733 回答