偏移量和长度超出了数组的范围

时间:2018-09-19 05:48:45

标签: c#

我的代码

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

reader.Read(buff,0,size);中的异常 例外情况是偏移量和数组长度超出范围,或者计数大于从索引到源集合结尾的元素数量

2 个答案:

答案 0 :(得分:1)

退后一步,考虑一下您的代码

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

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

然后,您尝试将2000个字节读取到只能容纳1000个字节的数组中,不执行任何检查以确保数组足够大,也不要尝试分块读取并连接(如果数组不够大)

这就是为什么您会得到错误的原因,但是对于应该编码的内容,我认为您需要考虑更多的问题-可能是为了响应读取的int大小而使缓冲区的大小,或分块读取。.

答案 1 :(得分:1)

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

在“ reader.Read(buff,0,size);”上设置一个断点然后将鼠标悬停在buff和大小上,您就会明白我的意思。

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

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

特别是因为无论如何您只是将其读入提供的缓冲区的开头。


概述您当前正在做的事情:

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

以为我会再解释一下,以防您了解正在发生的事情。