Распакуйте поток в строку, используя SevenZipSharp - PullRequest
0 голосов
/ 19 мая 2018

Я бы хотел сжать строку с помощью 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 Ответ

0 голосов
/ 19 мая 2018

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

Следующая проблема заключается в том, что вы пытаетесь прочитать из 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;
...