解码LZMA流c#

时间:2015-07-08 02:14:54

标签: c# filestream 7zip lzma sevenzipsharp

我正在尝试将LZMA流解码为流对象,以便我可以从中读取而不会占用内存。

我的输入文件如下:

some uncompressed data
.
.
some lzma compressed data
.
.

我想读取未压缩的数据,然后创建一个流对象来读取其余的压缩数据。

将整个事物读入byte []不是一个选项,因为文件太大了。我需要一个流(必须是可能的,因为你可以压缩非常大的文件)

我尝试过使用sevenzipsharp,但由于缺乏文档,因此我的(非常重要)经验的人无法理解。

有什么建议吗?

编辑:我正在从文件读入内存,因此将zip文件解码为文件是不够的。

2 个答案:

答案 0 :(得分:0)

您可以使用FileStream.Read方法读取流的未压缩部分。在读取所有未压缩部分之后,此方法将底层流的位置提升到压缩部分的开头,实际上成为可用于解压缩的压缩部分的流。

FileStream.Read使用未压缩的数据填充字节数组。要轻松解析其内容,您可以使用BinaryReader,如下所示:

BinaryReader reader = BinaryReader(new MemoryStream(byteArray));

答案 1 :(得分:0)

public static void Decompress(string inFile, string outFile) {
 try {
  inStream = new FileStream(inFile, FileMode.Open);
  outStream = new FileStream(outFile, FileMode.Create);

  byte[] properties = new byte[5];
  if (inStream.Read(properties, 0, 5) != 5)
   throw (new Exception("Input stream is too short."));

  Compression.LZMA.Decoder decoder = new Compression.LZMA.Decoder();
  decoder.SetDecoderProperties(properties);

  var br = new BinaryReader(inStream, Encoding.UTF8);
  long decompressedSize = br.ReadInt64();
  long compressedSize = br.ReadInt64();
  decoder.Code(inStream, outStream, compressedSize, decompressedSize, null);
 } catch (Exception e) {
  throw e;
 } finally {

  inStream.Flush();
  inStream.Close();
  outStream.Flush();
  outStream.Close();
 }
}