Распакуйте поток в строку, используя SevenZipSharp

Я хотел бы сжать строку с помощью SevenZipSharp и собрать воедино консольное приложение C# (я новичок в C#), используя следующий код (биты и кусочки которого возникли из аналогичных вопросов здесь, в SO).

Компрессия, кажется, работает (хотя я передаю файл вместо строки), вывод сжатой строки на консоль выглядит как бред, но я застрял на распаковке...

Я пытаюсь сделать то же самое, что и здесь (я думаю):

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

Спасибо:)

using System;
using System.IO;
using SevenZip;

namespace _7ZipWrapper
{
    public class Program
    {
        public static void Main()
        {
            SevenZipCompressor.SetLibraryPath(@"C:\Temp\7za64.dll");
            SevenZipCompressor compressor = new SevenZipCompressor();
            compressor.CompressionMethod = CompressionMethod.Ppmd;
            compressor.CompressionLevel = SevenZip.CompressionLevel.Ultra;
            compressor.ScanOnlyWritable = true;

            var compStream = new MemoryStream();
            var decompStream = new MemoryStream();
            compressor.CompressFiles(compStream, @"C:\Temp\a.txt");

            StreamReader readerC = new StreamReader(compStream);
            Console.WriteLine(readerC.ReadToEnd());
            Console.ReadKey();

            // works up to here... below here output to consol is: ""
            SevenZipExtractor extractor = new SevenZip.SevenZipExtractor(compStream);
            extractor.ExtractFile(0, decompStream);

            StreamReader readerD = new StreamReader(decompStream);
            Console.WriteLine(readerD.ReadToEnd());

            Console.ReadKey();
        }
    }
}

1 ответ

Решение

Результатом сжатия являются двоичные данные - это не строка. Если вы попытаетесь прочитать это как строку, вы просто увидите мусор. Этого следовало ожидать - вы не должны воспринимать это как строку.

Следующая проблема в том, что вы пытаетесь читать с compStream дважды, без "перемотки". Вы начинаете с конца потока, что означает, что нет данных для его распаковки. Если вы просто добавите:

compStream.Position = 0;

прежде чем создавать экстрактор, вы можете сразу же обнаружить, что он работает. Вам также может понадобиться перемотать decompStream прежде чем читать из него. Таким образом, у вас будет такой код:

 // Rewind to the start of the stream before decompressing
 compStream.Position = 0;
 SevenZipExtractor extractor = new SevenZip.SevenZipExtractor(compStream);
 extractor.ExtractFile(0, decompStream);

 // Rewind to the start of the decompressed stream before reading
 decompStream.Position = 0;
Другие вопросы по тегам