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

how to get position and length of unzipped gzipstream in c#?

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

长度
此 属性 不受支持,并且始终抛出 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 调用

您可以将 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
    }
}

根据您正在解码的内容,您可以使用 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
    //
 
}