Заголовок и суффикс Gzipstream

Как узнать размер моего сжатого файла, используемого GzipStream? Я знаю, что у него есть заголовок и суффикс. Первые 10 байт - заголовок, вторые 8 байт - суффикс. Как узнать размер файла в суффиксе?


person Alex    schedule 20.11.2016    source источник
comment
Само собой разумеется, но я все равно скажу это, потому что ни один из ответов не подходит: последние 4 байта - это исходная длина MOD 2 ^ 32.   -  person Ronnie Overby    schedule 09.04.2019


Ответы (3)


Что-то лучше написано:

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

Я вижу, что вы проголосовали за мой предыдущий ответ, скорее всего, потому, что это был пример использования Java. Принцип тот же, поэтому ответ на ваш вопрос будет заключаться в том, что последние 4 байта содержат необходимую вам информацию. Надеюсь, этот ответ больше того, что вам нужно.

Вот пример функции С# Decompress для распаковки GZip, включая получение размера сжатого файла, используемого 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;
}
person WizzKidd    schedule 20.11.2016
comment
Это Java, а не С#. В некоторых случаях C# и Java могут быть очень похожи и приемлемы для ответа на java с помощью c# или c# с java, но в этом случае код совершенно другой. - person Gusman; 22.11.2016
comment
Если вы отредактируете свой ответ и поместите в него другой ответ, я удалю отрицательный голос, я не могу удалить, если вы не измените ответ, С.О. не позволяет. - person Gusman; 22.11.2016
comment
Привет, @gusman, я отредактировал свой пост, как вы и просили, чтобы убрать прикус (хотя это было 3 года назад, лол) - person WizzKidd; 06.01.2019

Я вижу, что вы проголосовали за мой предыдущий ответ, скорее всего, потому, что это был пример использования Java. Принцип тот же, поэтому ответ на ваш вопрос будет заключаться в том, что последние 4 байта содержат необходимую вам информацию. Надеюсь, этот ответ больше того, что вам нужно.

Вот пример функции С# Decompress для распаковки GZip, включая получение размера сжатого файла, используемого 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;
}
person WizzKidd    schedule 21.11.2016