BinaryReader,按块读取,ArgumentException,Offset和长度越界



我的流有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;
}

这是因为addressbuffer的起点。

所以你的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);

这将从address 开始用BlockSize字节填充buffer

相关内容

  • 没有找到相关文章

最新更新