使用 SevenZipSharp 将流解压为字符串
Decompress Stream to String using SevenZipSharp
我想使用 SevenZipSharp 压缩一个字符串,并使用以下代码拼凑了一个 C# 控制台应用程序(我是 C# 的新手)(其中的点点滴滴来自 SO 上的类似问题) .
压缩部分似乎有效(尽管我传递的是文件而不是字符串),压缩字符串输出到控制台看起来像乱码,但我一直在解压缩...
我正在尝试做与此处相同的事情(我认为):
感谢任何帮助,理想情况下,控制台将显示压缩字符串,然后显示解压缩字符串。
谢谢:)
using System;
using System.IO;
using SevenZip;
namespace _7ZipWrapper
{
public class Program
{
public static void Main()
{
SevenZipCompressor.SetLibraryPath(@"C:\Tempza64.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();
}
}
}
压缩的结果是二进制数据 - 它不是字符串。如果您尝试将其作为字符串读取,您只会看到垃圾。这是意料之中的 - 你不应该把它当作一个字符串。
下一个问题是您试图从 compStream
中读取两次,而没有先读取 "rewinding"。您是从流的末尾开始的,这意味着没有要解压缩的数据。如果你只是添加:
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;
我想使用 SevenZipSharp 压缩一个字符串,并使用以下代码拼凑了一个 C# 控制台应用程序(我是 C# 的新手)(其中的点点滴滴来自 SO 上的类似问题) .
压缩部分似乎有效(尽管我传递的是文件而不是字符串),压缩字符串输出到控制台看起来像乱码,但我一直在解压缩...
我正在尝试做与此处相同的事情(我认为):
感谢任何帮助,理想情况下,控制台将显示压缩字符串,然后显示解压缩字符串。
谢谢:)
using System;
using System.IO;
using SevenZip;
namespace _7ZipWrapper
{
public class Program
{
public static void Main()
{
SevenZipCompressor.SetLibraryPath(@"C:\Tempza64.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();
}
}
}
压缩的结果是二进制数据 - 它不是字符串。如果您尝试将其作为字符串读取,您只会看到垃圾。这是意料之中的 - 你不应该把它当作一个字符串。
下一个问题是您试图从 compStream
中读取两次,而没有先读取 "rewinding"。您是从流的末尾开始的,这意味着没有要解压缩的数据。如果你只是添加:
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;