Как заворачивать поток (файлы) в 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)
, надеюсь мою ошибку не повторят.
Во-первых, надо понимать, что Deflate-компрессия - это смесь Хаффмана и Лемпеля-Зива. Где-то для всего этого надо хранить заголовки и таблицы (дерево кодов Хаффмана).
С чего вы взяли, что должно получится в итоге 5 байт? Я так понимаю, что вы просто представили, что оно станет в 2 раза меньше? Спешу вас огорчить, сжать можно далеко не всё.
Поэтому к вашим гипотетическим 5 байтам, прибавляются сверху служебные данные, которые и дают 104 байта (на самом деле должно быть меньше, что указывает на какую-то еще ошибку или слабую реализацию). А если сжать 100 байт, то получается примерно такой же объем данных (энтропия аналогична), и уже не так плохо в общих чертах. А вот если сжать 1000 байт, то будет даже профит заметен.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как программно реализовать слайд-шоу в Visual Studio? Какими элементами управления необходимо для этого воспользоваться, помимо PictureBox?
Есть таблица, в ней хранятся данные об отработанных часах
Как можно ускорить работу данного кода? Требуется, чтобы скорость обработки кода не превышала 1sec
В компоненте от DevExpress gridControl есть возможность промежуточных итоговЕсли формат ячейки TimeSpan то при суммировании прибавляются дни, то есть...