如何在c#中获取解压缩的gzipstream的位置和长度?

时间:2018-04-19 22:44:56

标签: c# gzip binaryreader

我尝试使用二进制阅读器读取.gz文件,首先使用gzipstream解压缩,然后使用gzipstream创建一个新的二进制阅读器。但是,当我尝试使用BinaryReader的BaseStream.Position和BaseStream.Length时(知道我在文件末尾的时间),我得到一个NotSupportedException,检查GZipStream类中这些字段的doc显示:

长度
不支持此属性并始终抛出NotSupportedException。(重写Stream.Length。)

位置
不支持此属性,并始终抛出NotSupportedException。(重写Stream.Position。)

所以我的问题是,当我使用BinaryReader读取解压缩的GZipStream时,我怎么知道文件末尾的时间?感谢

这是我的代码:

Stream stream = new MemoryStream(textAsset.bytes);
GZipStream zippedStream = new GZipStream(stream, CompressionMode.Decompress);
using (BinaryReader reader = new BinaryReader(zippedStream))
    while(reader.BaseStream.Position != reader.BaseStream.Length)
    {
        //do stuff with BinaryReader
    }

上述抛出: NotSupportedException:不支持操作。 System.IO.Compression.DeflateStream.get_Position()

由于while()

中的BaseStream.Position调用

2 个答案:

答案 0 :(得分:1)

您可以将zippedStream复制到MemoryStream实例,可以使用ToArray功能完整阅读。这是我能想到的最简单的解决方案。

Stream stream = new MemoryStream(textAsset.bytes);
byte[] result;
using (GZipStream zippedStream = new GZipStream(stream, CompressionMode.Decompress))
{
    using (MemoryStream reader = new MemoryStream())
    {
        zippedStream.CopyTo(reader);
        result = reader.ToArray();
    }
}

或者,如果你想以块的形式阅读流

using (GZipStream zippedStream = new GZipStream(stream, CompressionMode.Decompress))
{
    byte[] buffer = new byte[16 * 1024];
    int read;
    while ((read = zippedStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        // do work
    }
}

答案 1 :(得分:1)

根据要解码的内容,可以使用BinaryReader将第一种类型读入字节数组,然后使用BitConverter将这些字节转换为所需的类型。然后,您可以照常使用BinaryReader,直到下一条记录开始。

byte[] headermarker = new byte[4];

int count;

// if bytes available in underlying stream.
while ((count = br.Read(headermarker, 0, 4) > 0 )
{
    Int32 marker = BitConverter.ToInt32(headermarker, 0);

    //
    // now use Binary Reader for the rest of the record until we loop
    //
 
}