【问题标题】:Why does CopyTo throw ArgumentOutOfRangeException?为什么 CopyTo 会抛出 ArgumentOutOfRangeException?
【发布时间】:2012-10-04 23:47:18
【问题描述】:

为什么CopyTo 会导致异常?它下面的代码完美无缺,是我认为copyto会做的。

using (var mem = new MemoryStream())
{
    using (var memin = new MemoryStream(v.body))
    using (var comp = new BZip2InputStream(memin))
    {
        //comp.CopyTo(mem); //Non-negative number required (System.ArgumentOutOfRangeException)
        var buf = new Byte[1024 * 4];
        int len=0;
        while ((len = comp.Read(buf, 0, buf.Length)) > 0)
        {
            mem.Write(buf, 0, len);
        }

    }

【问题讨论】:

  • 因为v.body 的内容有问题,或者BZip2InputStream 期望看到的和实际看到的不匹配?从SharpZipLib 抛出异常。阅读代码并找出答案。
  • @Jon 不正确,堆栈跟踪显示它发生在 System.IO.MemoryStream.Write 在 InternalCopyTo 和 CopyTo 之后。 BZip2InputStream 不在堆栈跟踪中
  • 太棒了。所以通过猜测进行调试是行不通的。您介意发布堆栈跟踪和其他相关信息以便我们停止这样做吗?

标签: .net stream


【解决方案1】:

这是BZip2InputStream.Read(byte[] buffer, int offset, int count) 中的一个错误。它返回 -1 而不是 0。我报告了 the bug

CopyTo 也像问题中的代码那样通过 != 0 而不是 >0 进行检查。

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 2021-12-20
    • 2021-03-05
    • 2021-03-19
    • 2023-03-14
    • 2021-04-09
    • 2014-12-18
    • 2013-12-08
    相关资源
    最近更新 更多