我的流有1467个字节,一个块有489个字节,地址是978,我想要一个块。所以它是流中的最后一个块[从978到文件结尾] 但是我给出了这个例外:偏移量和长度超出了数组的范围,或者计数大于从索引到源集合末尾的元素数量。
但为什么呢?从978到1467是489个字节,我尝试从978读取489个字节,那么为什么会抛出这个异常?
这是我的代码。
public List<Block<T>> ReadBlock(int address)
{
var result = new List<Block<T>>();
using (var br = new BinaryReader(new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Read),Encoding.Default))
{
var buffer = new byte[BlockSize];
br.Read(buffer, address, BlockSize);
if (buffer.Sum(item => item) == 0)
{
result.Add(new Block<T>());
}
else
{
var block = new Block<T>();
block.Deserialize(buffer);
result.Add(block);
}
}
return result;
}
答案 0 :(得分:5)
这是因为address
是buffer
中的起点。
所以你的buffer
长度是489,但是你试图从索引978开始填充它(超出范围)
在填充缓冲区之前,您需要使用Seek
移动到偏移量(地址)
var buffer = new byte[BlockSise];
// go to offset address
br.BaseStream.Seek(address, SeekOrigin.Begin);
// fill buffer from starting at address to address + BlockSise
br.Read(buffer, 0, BlockSise);
这将从buffer
BlockSize
address
个字节