【问题标题】:Decode an LZMA stream c#解码 LZMA 流 c#
【发布时间】:2015-07-08 02:14:53
【问题描述】:

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

我的输入文件如下所示:

some uncompressed data
.
.
some lzma compressed data
.
.

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

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

我尝试过使用 Sevenzipsharp,但缺乏文档使得以我(不是很重要)经验的人无法理解。

有什么建议吗?

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

【问题讨论】:

  • 如果你使用FileStream它不会占用内存,因为它会从磁盘读取文件。
  • 这不一样。这从文件读取到文件。我想从文件中读取,解压缩和处理,而不存储解压缩的数据。
  • 你找到解决办法了吗?
  • 我放弃了这个,因为它是我用另一个 API 替换的东西的子问题。该api用于读取一个名为osu的游戏的文件,所以如果这不是您要查找的内容,那么我没有解决它。

标签: c# filestream 7zip lzma sevenzipsharp


【解决方案1】:

您可以使用FileStream.Read 方法读取流的未压缩部分。在读取所有未压缩部分后,该方法将底层流的位置提升到压缩部分的开头,从而有效地成为可用于解压缩的压缩部分的流。

FileStream.Read 用未压缩的数据填充字节数组。要轻松解析其内容,您可以像这样使用BinaryReader

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

【讨论】:

  • 这不能回答问题,因为您正在将它读入字节数组,这就是我所说的我特别想避免的。该文件太大而无法加载到字节数组中,所以我想将其作为流读取。
  • @maboesanman 看来您误解了答案。字节数组仅用于未压缩部分。如您所愿,压缩部分保留在流中。未压缩部分的大小是多少?
  • 根据定义,未压缩部分大于压缩部分。未压缩的数据是一串字符,我需要这些字符的流,所以我不必在读取它们后存储它们。
【解决方案2】:
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();
 }
}

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多