none
GZip Stream Read() возвращает 0 RRS feed

  • Вопрос

  • Здравствуйте, помогите разобраться с классом GZStream. Я написал функцию которая сначала запоковывает массив байтов, а потом распоковывает его. Вот текст:

     

     

          string Str = "ABC";
          byte[] bytes = Encoding.Default.GetBytes(Str);
          MemoryStream Mems = new MemoryStream();
          GZipStream GZip = new GZipStream(Mems,   CompressionMode.Compress);
          GZip.Write(bytes, 0, bytes.GetLength(0));
          byte[] bytes2 = new byte[int.Parse(Mems.Length.ToString())];
          Mems.Position = 0;
          Mems.Read(bytes2, 0, bytes2.GetLength(0));
          GZip.Close();
          string Str2 = Encoding.Default.GetString(bytes2);
          MemoryStream Mems2 = new MemoryStream(bytes2);
          Mems2.Position = 0;
          byte[] bytes3 = new byte[int.Parse(Mems2.Length.ToString()) + 3];
          GZipStream GUnZip = new GZipStream(Mems2, CompressionMode.Decompress);
          GUnZip.Read(bytes3, 0, bytes3.GetLength(0)); // не считывает байты в массив
          string Str3 = Encoding.Default.GetString(bytes3);
          MessageBox.Show(Str2+" "+Str3);
    
    проблема в том, что функция GUnZip.Read(bytes3, 0, bytes3.GetLength(0)) не считывает байты из потока в массив и возвращает 0. Помогите понять в чем тут дело. Два дня уже бьюсь. Заранее благодарин.

    27 ноября 2010 г. 9:10

Ответы

  • Читать данные из GZipStream можно только после закрытия GZipStream, до этого вы будите иметь неполностью сжатые данные. Вдобавок GZipStream записывает дополнительную информацию в MemoryStream перед уничтожением. Об этом написано в блоге разработчиков (Using a MemoryStream with GZipStream [Lakshan Fernando]).

    Пример:

          byte[] buffer;
          MemoryStream stream = new MemoryStream();
          using (GZipStream gz = new GZipStream(stream, CompressionMode.Compress))
          {
            byte[] buf = Encoding.Default.GetBytes("Hello Test");
            gz.Write(buf, 0, buf.Length);
          }
          buffer = stream.ToArray();
    
          MemoryStream ms2 = new MemoryStream(buffer);
          using (GZipStream gz = new GZipStream(ms2, CompressionMode.Decompress))
          {
            byte[] buf = new byte[ms2.Length];
            gz.Read(buf, 0, buf.Length);
    
            string s = Encoding.Default.GetString(buf);
            MessageBox.Show(s);
          }
    


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 30 ноября 2010 г. 9:41
    28 ноября 2010 г. 21:59