I have been working with Gzip files, and needed a solid way to read a stream into a correct byte size array. I studied some of what MSDN says to do, and worked out a solution to the problem. The problem is MSDN doesn’t set the size of the array and uses a default size of 4086 bytes. Some of the files I decompress are well over that amount, so I read the RFC (RFC 1952) for a Gzip, and came up with the following code.
In the program that I’m writing, there is code for us to control the amount of memory that we allocate for each item used. The basic idea is to only allocate the amount of memory that you need, and this goes back to my unmanaged coding days.
Using the Code
Instead of creating a huge array of bytes and guessing what the actual size would be, we can parse the packed bytes and get the last 4 bits using
ConvertBit, and get the decompressed size. I use the code for messages that are wrapped in headers, so that is why I use the variable
start to offset the data, which is the start of my Gzip data. This fairly straightforward code just passes the byte array and the start index into the function, and it will hand back the decompressed file.
public static byte HandleGzipMessage(byte data, int start)
int size = BitConverter.ToInt32(data, data.Length - 4);
byte uncompressedData = new byte[size];
memStream = new MemoryStream(data, start, (data.Length - start));
memStream.Position = 0;
GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress);
gzStream.Read(uncompressedData, 0, size);
Points of Interest
I hope this helps someone out with Gzip files.