.NET GZipStream сжимать и распаковывать

Это иногда называют Yoda-conditions , есть забавный список всех таких конструкций и их неофициальных имен.

Нет никакой реальной разницы между $var === false или false === $var, некоторые утверждают, что легче видеть, что проверяется, если bool - левый операнд, другие ненавидят его ... Короче: личное предпочтение - это то, что есть.

13
задан Brian Tompsett - 汤莱恩 25 December 2015 в 13:07
поделиться

3 ответа

Попробуйте этот код:

public static bool Test()
        {
            string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods";

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

            byte[] data = encoding.GetBytes(sample);
            bool result = false;

            // Compress
            MemoryStream cmpStream = new MemoryStream();

            GZipStream hgs = new GZipStream(cmpStream, CompressionMode.Compress);

            hgs.Write(data, 0, data.Length);

            byte[] cmpData = cmpStream.ToArray();

            MemoryStream decomStream = new MemoryStream(cmpData);

            hgs = new GZipStream(decomStream, CompressionMode.Decompress);
            hgs.Read(data, 0, data.Length);

            string sampleOut = encoding.GetString(data);

            result = String.Equals(sample, sampleOut);
            return result;
        }

Проблема в том, что вы не использовали ASCIIEncoder для возврата строки для sampleData.

РЕДАКТИРОВАТЬ: Вот очищенная версия кода, чтобы помочь с закрытием / удалением:

public static bool Test()
        {
            string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods";

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

            byte[] data = encoding.GetBytes(sample);

            // Compress.
            GZipStream hgs;
            byte[] cmpData;

            using(MemoryStream cmpStream = new MemoryStream())
            using(hgs = new GZipStream(cmpStream, CompressionMode.Compress))
            {
                hgs.Write(data, 0, data.Length);
                hgs.Close()

                // Do this AFTER the stream is closed which sounds counter intuitive 
                // but if you do it before the stream will not be flushed
                // (even if you call flush which has a null implementation).
                cmpData = cmpStream.ToArray();
            }  

            using(MemoryStream decomStream = new MemoryStream(cmpData))
            using(hgs = new GZipStream(decomStream, CompressionMode.Decompress))
            {
                hgs.Read(data, 0, data.Length);
            }

            string sampleOut = encoding.GetString(data);

            bool result = String.Equals(sample, sampleOut);
            return result;
        }
14
ответ дан 1 December 2019 в 17:51
поделиться

Закройте GZipStream после вызова Write .

Без вызова Close , есть вероятность, что некоторые данные буферизуются и не записываются в базовый поток еще.

19
ответ дан 1 December 2019 в 17:51
поделиться

There were three issues to solve the problem. 1. После ЗАПИСИ GZipStream НЕОБХОДИМО закрыть :: hgs.Close ();

  1. Для чтения GZipStream необходимо было использовать цикл WHILE и записывать меньший буфер несжатых данных в MemoryStream :: outStream.Write (...) ;

  2. Преобразование распакованного массива byte [], необходимое для использования преобразования кодировки :: string sampleOut = encoding.GetString (data);

Вот последний код: -

public static bool Test()
        {
            string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods";
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            byte[] data = encoding.GetBytes(sample);
            bool result = false;

            // Compress 
            MemoryStream cmpStream = new MemoryStream();
            GZipStream hgs = new GZipStream(cmpStream, CompressionMode.Compress, true);

            hgs.Write(data, 0, data.Length);
            hgs.Close();


            //DeCompress
            byte[] cmpData = cmpStream.ToArray();
            MemoryStream decomStream = new MemoryStream(cmpData);

            data = new byte[data.Length];
            hgs = new GZipStream(decomStream, CompressionMode.Decompress, true);

            byte[] step = new byte[16]; //Instead of 16 can put any 2^x
            MemoryStream outStream = new MemoryStream();
            int readCount;

            do
            {
                readCount = hgs.Read(step, 0, step.Length);
                outStream.Write(step, 0, readCount);
            } while (readCount > 0);
            hgs.Close();

            string sampleOut = encoding.GetString(outStream.ToArray());
            result = String.Equals(sample, sampleOut);
            return result; 
        }

У меня действительно были проблемы с сжатием / распаковкой с помощью объекта Microsoft .NET GZipStream. Наконец, я думаю, что понял это правильно. Большое спасибо всем, так как решение пришло от всех вас.

9
ответ дан 1 December 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: