1

我想使用 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();
        }
    }
}
4

1 回答 1

2

压缩的结果是二进制数据——它不是字符串。如果您尝试将其读取为字符串,您只会看到垃圾。这是意料之中的——你不应该把它当作一个字符串。

下一个问题是你试图从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;
于 2018-05-19T06:24:54.707 回答