Alex
Alex

Reputation: 73

Gzipstream header and suffix

How do I know the size of my compressed file used GzipStream? I know that it has a header and suffix. First 10 bytes - it's header, second 8 bytes - suffix. How do I know the size file in the suffix?

Upvotes: 1

Views: 1326

Answers (3)

WizzKidd
WizzKidd

Reputation: 206

I see that you down voted my previous answer most likely because it was an example using Java. The principle is still the same, so the answer to your question would be that the last 4 bytes contain the information you require. Hopefully this answer is more what you are after.

Here is a C# Decompress function example of decompressing the GZip inclusive of getting the size of the compressed file used by GZipStream:

static public byte[] Decompress(byte[] b)
{
    MemoryStream ms = new MemoryStream(b.length);
    ms.Write(b, 0, b.Length);
    //last 4 bytes of GZipStream = length of decompressed data
    ms.Seek(-4, SeekOrigin.Current);
    byte[] lb = new byte[4];
    ms.Read(lb, 0, 4);
    int len = BitConverter.ToInt32(lb, 0);
    ms.Seek(0, SeekOrigin.Begin);
    byte[] ob = new byte[len];
    GZipStream zs = new GZipStream(ms, CompressionMode.Decompress);
    zs.Read(ob, 0, len);
    returen ob;
}

Upvotes: 1

Gusman
Gusman

Reputation: 15151

Something a bit better written:

public int GetUncompressedSize(string FileName)
{
   using(BinaryReader br = new BinaryReader(File.OpenRead(pathToFile))
   {
        br.BaseStream.Seek(SeekOrigin.End, -4);
        return br.ReadInt32();
   }
}

Upvotes: 1

WizzKidd
WizzKidd

Reputation: 206

I see that you down voted my previous answer most likely because it was an example using Java. The principle is still the same, so the answer to your question would be that the last 4 bytes contain the information you require. Hopefully this answer is more what you are after.

Here is a C# Decompress function example of decompressing the GZip inclusive of getting the size of the compressed file used by GZipStream:

static public byte[] Decompress(byte[] b)
{
    MemoryStream ms = new MemoryStream(b.length);
    ms.Write(b, 0, b.Length);
    //last 4 bytes of GZipStream = length of decompressed data
    ms.Seek(-4, SeekOrigin.Current);
    byte[] lb = new byte[4];
    ms.Read(lb, 0, 4);
    int len = BitConverter.ToInt32(lb, 0);
    ms.Seek(0, SeekOrigin.Begin);
    byte[] ob = new byte[len];
    GZipStream zs = new GZipStream(ms, CompressionMode.Decompress);
    zs.Read(ob, 0, len);
    returen ob;
}

Upvotes: 0

Related Questions