This is part of a larger assignment that I’ve mostly got done except for this one part, which is a bit embarrassing because it sounds really simply on paper.
So basically, I’ve got a large amount of compressed data. I’ve been keeping track of the length using a CRC32
CRC32 checksum = new CRC32();
...
//read input into buffer
checksum.update(buff, 0, bytesRead);
So it updates everytime more info is read in. I’ve also kept track of the uncompress length using
uncompressedLength += manage.read(buff);
So it is an int value that has the number of bytes of the original file. This is a little Endian machine.
From what I can tell, what I need is four byte CRC, which I used
public byte[] longToBytes(long x) {
ByteBuffer buffer = ByteBuffer.allocate(8);
buffer.putLong(x);
return buffer.array();
}
byte[] c = longToBytes(checksum.getValue());
BUT this is 8 bytes. CRC32.getValue returns a long. Can I convert it to an int in this case without losing information I need?
And then the ISIZE is supposed to be…the four byte compressed length modulo 2^32. I’ve got the variable uncompresedLength which is an int. I think I just have to convert it to bytes and that’s all?
I’ve been hexdumping the result from gzip and the result from my program and my header and data are right, I’m just missing my trailer.
As for why I’m doing this manually, it’s because of an assignment. Trust me, I’d love to just use GZIPOoutputStream if I could.
CRC32 has 32 bits… the class returns
longbecause of the super interface.uncompressed length should be
long, since nowadays files larger than 2G isn’t uncommon.so in both cases, you need to convert the lowest 32 bits of a long to 4 bytes.