GZip Decompress - каков механизм обработки?

232
17 марта 2017, 23:07

Написал метод, который по идее должен обрабатывать блоки, запакованные GZip

Беда в том, что на выходе я получаю пустой массив байт. Где ошибка в этом коде?

 private void DecompressionBlock(object x)
    {
        int i = (int)x;
        int _DecompressSize = BitConverter.ToInt32(iDecompressSize[i], 0);            
        int _CompressSize = BitConverter.ToInt32(iCompressSize[i], 0);
        Console.WriteLine("{0}", _DecompressSize);  //1024
        Console.WriteLine("{0}", _CompressSize);    //732
        Console.WriteLine("{0}", firstBuff[i].Length); //732

        secondBuff[i] = new byte[_DecompressSize];
        using (MemoryStream output = new MemoryStream())
        {
            using (GZipStream ds = new GZipStream(output, CompressionMode.Decompress))
            {
                ds.Read(firstBuff[i], 0, _CompressSize);                    
            }
            secondBuff[i] = output.ToArray();
            Console.WriteLine("{0}", secondBuff[i].Length); //0 
        }
    }

Если написать:

using (MemoryStream output = new MemoryStream(secondBuff[i]))

Во время работы возникает исключение, и ругань на "магическое число" GZip

В компрессоре я отдельно запаковывал каждый массив байтов GZip-ом, и добавлял на стадии записи в фал перед ним блоки с размерами, при чтении я эти данные читаю, и записываю в массив целый не тронутый никем блок для того же gZip.

Может я что-то упустил из виду?

Вот метод компрессии:

private void CompressionBlock(object x)
    {                   
        int i = (int)x;
        using (MemoryStream output = new MemoryStream())
        {
            long _outLength;
            using (GZipStream cs = new GZipStream(output, CompressionMode.Compress))
            {
                cs.Write(firstBuff[i], 0, firstBuff[i].Length);
                _outLength = output.Length;              
            }
            secondBuff[i] = new byte[_outLength];
            secondBuff[i] = output.ToArray();
            // Запишем размер сжатого блока
            int _sizeBlock = secondBuff[i].Length;
            Console.WriteLine("Размер сжатого блока - {0}", _sizeBlock);
            iCompressSize[i] = new byte[4];
            iCompressSize[i] = BitConverter.GetBytes(_sizeBlock);
        }
    }
READ ALSO
Вывод трех знаков после запятой

Вывод трех знаков после запятой

Есть переменная типа double d = 15997, подскажите пожалуйста, как вывести три знака после запятой не округляя его? Пробовал Console

441
одинаковые значения в <select>, полученные из msql

одинаковые значения в <select>, полученные из msql

Добрый деньПрошу Вашей помощи в следующем вопросе: Есть выпадающий список, который я получаю в результате выборки из БД SQL

213
непонятное с синтаксисом оператора `array_rand`

непонятное с синтаксисом оператора `array_rand`

Синтаксис array_rand, гласит: array_rand ( array input [, int num_req] ), где num_req - количество выбираемых значений

241
Почему возникает ошибка Parse error: syntax error, unexpected T_VARIABLE?

Почему возникает ошибка Parse error: syntax error, unexpected T_VARIABLE?

Здравствуйте, внутри класса есть задание конфига:

265