MSDN C#DeflateStream示例代码问题


0

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

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

由于事先 乔治

3

我不知道他们为什么这样做,但它不是一般的一个很好的例子 - 例如,他们正在使用显式调用的FileStream而是采用了using声明,并假设以Read单一的通话将读取整个文件的Close(不是在finally块)。哎呀,即使将整个文件读入缓冲区也是一个糟糕的主意 - 最好是一次将块复制到DeflateStream

这些东西表明,我认为这是不值得担心这个例子中的代码,这个特定的奇数位(额外的100个字节)。当然不要把它视为“最佳实践”。

MSDN的例子通常比这更好的 - 虽然有很多其他奇怪的人的。

编辑:已经重新读取代码和CodeMelt的答案,它确实需要额外的100个字节 - 但仅仅是因为ReadAllBytesFromStream实现如此糟糕。这里有一个更好的实现,它总是询问流填充缓冲区的其余部分:

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; 
} 

(请注意,有没有必要都offsettotalCount,因为他们总是有相同的值。)

  0

我完全同意你关于你的关闭点和完全读取所有字节。我只是想确认解压缩缓冲区是否与原始缓冲区的长度相同,在实践中不需要分配100字节或更多? 22 2月. 092009-02-22 12:26:54

  0

以前的实施代码在哪些情况下会有问题?你能告诉我一个例子吗? 22 2月. 092009-02-22 14:13:38

  0

当它得到接近陈列年底将引发ArgumentException(如果你不把数组大于必需的100个字节),因为“计数”参数定为100 22 2月. 092009-02-22 14:43:14

  0

嗨乔恩斯基特,什么样的文件会造成这种类型的异常?什么尺寸?我有兴趣做一个测试用例,并让我的手变脏。 24 2月. 092009-02-24 14:52:36

  0

如果您取出额外的100个字节,则只会抛出异常,但不*修复ReadAllBytesFromStream方法。我认为在这种情况下*任何*文件都会给出例外。 24 2月. 092009-02-24 15:04:46


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; 
} 
  0

困惑。 :-(你什么意思是“超过它的长度”,在什么情况下它会“超过它的长度”?如果结果长度与原始输入长度相同,那么很好,并且不需要再分配100个字节。 22 2月. 092009-02-22 12:31:31

  0

ReadAllBytesFromStream不检查缓冲区的长度,额外的100个字节是为流提供空间.Read(buffer,offset,100);返回0; 22 2月. 092009-02-22 12:33:46

  0

但是我认为没有必要创建一个额外的空间?是的影响,如果没有这样的额外空间的代码这种模式是非常奇怪的 22 2月. 092009-02-22 12:36:52

  0

@ George2:是的,这只是因为执行不力ReadAllBytesFromStream的主要看我更新的答案为更好地实施 22 2月. 092009-02-22 12:38:25

  0

在什么情况将以前的实现。代码有问题吗?请给我一个例子吗? 22 2月. 092009-02-22 14:14:17