MSDN C#DeflateStream示例代码问题

时间:2009-02-22 12:13:49

标签: c# compression deflatestream

任何想法为什么在下面的示例中,我们需要添加100(buffer.Length + 100)? buffer.Length应该与解压缩缓冲区长度相同,因此不需要再添加100个。 : - )

http://msdn.microsoft.com/en-us/library/bc2dbwea.aspx

提前谢谢, 乔治

2 个答案:

答案 0 :(得分:3)

我不知道他们为什么要这样做,但它一般不是一个很好的例子 - 例如,他们在{{Close上使用显式调用(不是在finally块中) 1}}而不是使用FileStream语句,并假设对using的单个调用将读取整个文件。哎呀,即使将整个文件读入缓冲区也是一个坏主意 - 最好一次将一个块复制到Read

这些事情告诉我,在这个例子中,不值得担心这个特定的奇数位代码(额外的100个字节)。当然不要把它当作“最佳实践”。

MSDN示例通常比这更好 - 尽管还有很多其他奇怪的例子。

编辑:重新阅读代码和CodeMelt的答案后,确实需要额外的100个字节 - 但这只是因为ReadAllBytesFromStream的实现非常糟糕。这是一个更好的实现,它总是要求流填充缓冲区的其余部分:

DeflateStream

(请注意,public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) { int offset = 0; int bytesRead; while ((bytesRead = stream.Read(buffer, offset, buffer.Length-offset)) > 0) { offset += bytesRead; } return offset; } offset都不需要,因为它们总是具有相同的值。)

答案 1 :(得分:2)

它阻止stream.Read(buffer,offset,100)在以下方法中超过其长度,因为流一直在读取,直到它什么都不读。

public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) 
{
// Use this method is used to read all bytes from a stream.
int offset = 0;
int totalCount = 0;
    while (true) 
    {
    // even it reads to the end, but it will still read the next
    // 100 bytes to see if anything has been read.
    int bytesRead = stream.Read(buffer, offset, 100); 
        if ( bytesRead == 0) 
        {
        break; 
        }
offset += bytesRead;
totalCount += bytesRead; 
    }
return totalCount;
}