【问题标题】:Offset and length were out of bounds for the array偏移量和长度超出了数组的范围
【发布时间】:2018-09-19 05:48:45
【问题描述】:

我的代码

private static int readinput(byte[] buff, BinaryReader reader)
{
    int size = reader.ReadInt32();
    reader.Read(buff, 0, size);
    return size;
}

阅读器异常。Read(buff, 0, size); 例外是偏移量和长度超出了数组的范围或计数大于从索引到源集合末尾的元素数

【问题讨论】:

  • if(size<=buff.lenght){reader.Read(buff, 0, size);}。否则,做点什么就太重要了。
  • 感谢您的宝贵回答。它帮助我了解了很多关于我正在编写的代码的知识。我的问题解决了。

标签: c#


【解决方案1】:

退一步想想你的代码

您编写了一个采用字节数组的方法。我们不知道这个数组有多大,但它是由调用该方法的代码控制的。假设它是 1000 字节长

然后你从其他地方读取一个 int,假设读取 2000

然后您尝试将 2000 个字节读入一个只能容纳 1000 个字节的数组,您不执行任何检查以确保您的数组足够大,也不会尝试读取块并在它不够大时进行连接

这就是为什么你会得到你得到的错误,但至于你应该编码什么,我认为你需要考虑更多——也许根据你读取的 int 大小来调整缓冲区的大小,或分块阅读..

【讨论】:

  • 感谢您的宝贵回答。它帮助我了解了很多关于我正在编写的代码的知识。我的问题解决了。
【解决方案2】:

您传递给函数以读取数据的缓冲区 buff 太小。 buff.Length 应该大于或等于名为 size 的变量。

在“reader.Read(buff, 0, size);”上设置断点并将鼠标悬停在 buff 和 size 上,你会明白我的意思。

确保在调用函数时,传入的 buff 足够大。如果您不知道提前创建缓冲区的大小,请将您的函数更改为如下所示:

private static byte[] ReadInput(BinaryReader reader)
{
    int size = reader.ReadInt32();
    return reader.ReadBytes(size);
}

特别是因为您只是将它读入提供的缓冲区的开头。


总结你目前正在做的事情:

您为我们提供了一个函数,该函数采用二进制读取器(无论它已经在什么位置,如果它是新的,则为位置 0),它读取一个 32 位整数(4 个字节)来计算它之后的一些数据的大小.然后,您将该大小的数据读入缓冲区。您可以使用提供的称为 buff 的缓冲区来完成所有这些工作。您需要确保无论您要读入什么大小的数据,提供给函数的缓冲区都有足够的大小。如果缓冲区的大小太大,则“reader.Read(buff, 0, size)”只会将其读入缓冲区的开头。因此,如果您的意图只是按照将函数编码到大小合适的缓冲区中的方式读取数据,我建议使用上面的代码。

只是想我会多解释一下,以帮助您了解发生了什么。

【讨论】:

  • 感谢您的宝贵回答。它帮助我了解了很多关于我正在编写的代码的知识。我的问题解决了。
猜你喜欢
  • 2021-08-25
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多