Лучший класс сжатия .NET Framework? - PullRequest
7 голосов
/ 10 мая 2010

Да, я знаю, что GZipStream или DeflateStream - обычные в .NET Framework, которые обрабатывают сжатие / распаковку.

Я хочу, чтобы в моей программе были функции сжатия / распаковки, но

  1. Я желаю .NET Framework C #, а не сторонний открытый исходный код. Я не могу использовать из-за этих ограничений авторского права в моей программе.

  2. GZipStream и DeflateStream не так хороши. например, GZipStream сжимает файл до 480 КБ, в то время как 7Zip сжимает тот же файл до размера 57 КБ.

Есть ли у Microsoft другие хорошие методы сжатия ???

Спасибо

Ответы [ 5 ]

5 голосов
/ 10 мая 2010

GZipStream и DeflateStream специально предназначены для сжатых потоков , а не для общего сжатия файлов для хранения.

За исключением этих классов, сжатие не встроено в .NET. Если вы хотите качественное сжатие, вам нужно перейти в стороннюю библиотеку. Проверьте http://www.7 -zip.org / sdk.html для библиотеки 7zip с открытым исходным кодом.

2 голосов
/ 10 мая 2010

Есть управляемая обёртка для 7zip. Лицензия LGPL, поэтому вы можете использовать ее в закрытых проектах. Я не знаю, соответствует ли это вашим требованиям к лицензии, поскольку вы их не указали.

http://sevenzipsharp.codeplex.com/

1 голос
/ 10 мая 2010

У меня нет статистики по коэффициентам сжатия, но я годами пользовался библиотекой SharpZipLib с большим успехом.

0 голосов
/ 21 мая 2019

Ну, я пытаюсь сжать как рекурсивные данные, это забавно. Проверьте мой пример:

private byte[] CompressWithLevels(byte[] data)
{
    using(MemoryStream ms = new MemoryStream())
    {
        using(GZipStream gz = new GZipStream(ms, CompressionMode.Compress))
        {
            gz.Write(data, 0, data.Length);
            return ms.ToArray();
        }
    }
}

Теперь я пытаюсь сжать файл слишком большого размера, например:

string path = @"c:\test.bin";
byte[] buffer = File.ReadAllBytes(path);
byte[] level1 = CompressWithLevels(buffer);
byte[] level2 = CompressWithLevels(level1);

Проверьте размер буфера, level1 и level2.
размер буфера составляет 77683, уровень1 = 57354 и уровень2 = 8202 ...

буфер равен 100%, тогда:
57354 составляет 73,83%
8202 - это 10,55%
так смешно.

0 голосов
/ 10 мая 2010

Вы также можете использовать ZLib с открытым исходным кодом (http://www.zlib.net/) с PInvoke или использовать оболочку для него (я использовал zlib.net - http://www.componentace.com/zlib_.NET.htm - но я считаю, что в нем были некоторые ошибки ). это менее удобно, чем управляемые библиотеки, но более эффективно, чем DeflateStream / GZipStream (которые такие же, за исключением дополнительного CRC в GZipStream).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...