Java-gzip成员预告片

Java-gzip成员预告片,java,compression,format,gzip,Java,Compression,Format,Gzip,这是一个更大的作业的一部分,我大部分都完成了,除了这一部分,这有点尴尬,因为这听起来很简单 所以基本上,我有大量的压缩数据。我一直在使用CRC32跟踪长度 CRC32 checksum = new CRC32(); ... //read input into buffer checksum.update(buff, 0, bytesRead); 因此,每次读取更多信息时,它都会更新。我还使用 uncompressedLength += manage.read(buff); 因此,它是一个in

这是一个更大的作业的一部分,我大部分都完成了,除了这一部分,这有点尴尬,因为这听起来很简单

所以基本上,我有大量的压缩数据。我一直在使用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返回一个长字符串。在这种情况下,我可以将其转换为int而不丢失所需的信息吗

然后ISIZE应该是…四字节压缩长度模2^32。我有一个变量uncompresedLength,它是一个int。我想我只需要把它转换成字节,就这样

我已经从gzip和我的程序和我的头和数据的结果是正确的,我只是错过了我的拖车结果


至于我为什么要手工做这件事,那是因为一个作业。相信我,如果可以的话,我很乐意使用GZIPOoutputStream。

要以小尾端形式编写一个整数,只需编写整数的低位字节(即模256或与0xff进行and),然后将其下移8位或除以256,然后编写生成的低位字节,然后再重复两次。您将写入四个字节。因为您只写四个,所以您将自动写入长度模232。

要以小尾数形式写入整数,只需写入整数的低位字节(即模256或与0xff进行and),然后将其下移八位或除以256,然后写入生成的低位字节,然后再重复两次。您将写入四个字节。因为您只写了四个,所以将自动写入长度模232。

CRC32有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)
    };
}

CRC32有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)
    };
}

如果它只是32位的低位,那么转换(int)checksum.getValue()是否相同……或者这是否真的切断了我需要的东西。因为如果这样做有效的话,我可以用字节缓冲区将int转换成字节…我认为一般来说,将long缩小到int可能是危险的。请参阅我的更新以获取long中较低的4个字节。如果它只是较低的32位,则只需强制转换(int)checksum.getValue()就可以了……或者这实际上切断了我需要的东西。因为如果这样做有效的话,我可以用字节缓冲区将int转换成字节…我认为一般来说,将long缩小到int可能是危险的。请参阅我的更新以获取长字符串的较低4字节。