c# DeflateStream глюк сжатия 100байт?

209
22 июня 2017, 02:23

Как заворачивать поток (файлы) в DeflateStream? С распаковкой проблем не было, первый раз пакую - получаю из 10 байт длинну "сжатого" пакета 104 (смешно), а уже этот пакет декомпресии не подлежит? DeflateStream не пакует, или я что-то упустил? Привожу кусок кода

  using System;
using System.IO;
public class Demo{
 public static void Main(string[] args){
   MemoryStream mm = new MemoryStream();// Исходный поток    
   mm.Write(new byte[] { 65,65,65,65,65, 65,65,65,65,65 },0, 10); // Пакую еденицы 1111111111 10байт
   mm.Position = 0;
   MemoryStream deflate =  new MemoryStream(); // сжатый поток
   using (System.IO.Compression.DeflateStream ds = new System.IO.Compression.DeflateStream(deflate, System.IO.Compression.CompressionMode.Compress,true))
     ds.Write(mm.ToArray(),0,(int)mm.Length); // сжимаю
   Console.WriteLine(deflate.Length); // смотрю длинну упаковки (должно по-идее быть 5 байт если упаковать zip и глянуть размер)
   byte[] x = new byte [100];
   int q=0;
   deflate.Position = 0;
   using (System.IO.Compression.DeflateStream d2 = new System.IO.Compression.DeflateStream(deflate, System.IO.Compression.CompressionMode.Decompress, true))
         q=d2.Read(x, 0, 100);// разжимаю

   Console.WriteLine(q); // размер "разпакованого"
  Console.WriteLine(x[0]); // Первый символ
}
}

Вместо 5 10 байт выдаёт 104 10 (может быть не 5, может быть от 3 ну до... 20). Исключения нету. Т.е. это чисто глюк дот-нета.

Сжатие zip получилось, при этом и 104 и 5 байт архиваторы нормально едят. А вопрос был, оказывается при паковке и разпаковке "сжатый" поток указывается в конструкторе. Во втором new DeflateStream я перепутал поток, поставив туда пустой new MemoryStream т.е. было var d3=new MemoryStream(); new DeflateStream(d3,Decompress) , надеюсь мою ошибку не повторят.

Answer 1

Во-первых, надо понимать, что Deflate-компрессия - это смесь Хаффмана и Лемпеля-Зива. Где-то для всего этого надо хранить заголовки и таблицы (дерево кодов Хаффмана).

С чего вы взяли, что должно получится в итоге 5 байт? Я так понимаю, что вы просто представили, что оно станет в 2 раза меньше? Спешу вас огорчить, сжать можно далеко не всё.

Поэтому к вашим гипотетическим 5 байтам, прибавляются сверху служебные данные, которые и дают 104 байта (на самом деле должно быть меньше, что указывает на какую-то еще ошибку или слабую реализацию). А если сжать 100 байт, то получается примерно такой же объем данных (энтропия аналогична), и уже не так плохо в общих чертах. А вот если сжать 1000 байт, то будет даже профит заметен.

READ ALSO
Нужна помощь с кодом реализации слайд-шоу

Нужна помощь с кодом реализации слайд-шоу

Как программно реализовать слайд-шоу в Visual Studio? Какими элементами управления необходимо для этого воспользоваться, помимо PictureBox?

199
Интервалы Datetime и TimeSpan больше 24 часов в c#

Интервалы Datetime и TimeSpan больше 24 часов в c#

Есть таблица, в ней хранятся данные об отработанных часах

215
Как ускорить работу кода на C#

Как ускорить работу кода на C#

Как можно ускорить работу данного кода? Требуется, чтобы скорость обработки кода не превышала 1sec

225
TimeSpan в GridControl от DevExpress

TimeSpan в GridControl от DevExpress

В компоненте от DevExpress gridControl есть возможность промежуточных итоговЕсли формат ячейки TimeSpan то при суммировании прибавляются дни, то есть...

256