Как сжать / распаковать строку с помощью SevenZip - 7Zip

Там очень плохая документация, поэтому я изо всех сил пытаюсь сделать это

Я добавил DLL-файлы и соответствующие ссылки

Наконец, он сжимает строку, но выдает ошибку, когда я распаковываю

Можете ли вы сказать мне, ошибка где?

    public static string SevenZip_CompressString(string text)
    {
        byte[] compressedData = null;

        SevenZipCompressor compressor = new SevenZipCompressor();
        compressor.CompressionMethod = CompressionMethod.Ppmd;
        compressor.CompressionLevel = SevenZip.CompressionLevel.Ultra;
        compressor.ScanOnlyWritable = true;
        compressor.DefaultItemName = "T";

        using (MemoryStream msin = new MemoryStream(Encoding.UTF8.GetBytes(text)))
        {
            using (MemoryStream msout = new MemoryStream())
            {
                compressor.CompressStream(msin, msout);

                compressedData = msout.ToArray();
            }
        }

        return System.Text.Encoding.UTF8.GetString(compressedData);
    }

Здесь ниже распаковка

    public static string SevenZip_DE_CompressString(string compressedText)
    {
        byte[] uncompressedbuffer = null;

        using (MemoryStream compressedbuffer = new MemoryStream(Encoding.UTF8.GetBytes(compressedText)))
        {
            using (SevenZipExtractor extractor = new SevenZipExtractor(compressedbuffer))
            {
                using (MemoryStream msout = new MemoryStream())
                {
                    extractor.ExtractFile(0, msout);
                    uncompressedbuffer = msout.ToArray();
                }
            }
        }

        return Encoding.UTF8.GetString(uncompressedbuffer);
    }

Здесь сообщение об ошибке я получаю

C# .net 4.5 WPF,

пакеты \SevenZipSharp.0.64\ Lib\SevenZipSharp.dll

1 ответ

Решение

Это неправильно:

System.Text.Encoding.UTF8.GetString(compressedData)
Encoding.UTF8.GetBytes(compressedText)

Сжатые данные не являются UTF-8. И вы не должны пытаться воспринимать это как текст. Всегда храните сжатые данные в двоичном виде, как byte[], Если вам необходимо передать его по текстовому каналу, например по электронной почте, используйте кодировку Base64.

Хотя в принципе измените свое мышление. Сжатие не является функцией string -> string, Это byte[] -> byte[], Также допустимо считать это string -> byte[],

Другие вопросы по тегам