gpt4 book ai didi

c# - BinaryReader,按 block 读取,ArgumentException,偏移量和长度超出范围

转载 作者:行者123 更新时间:2023-12-02 04:43:46 24 4
gpt4 key购买 nike

我的流有 1467 字节,一个 block 有 489 字节,地址是 978,我想要一个 block 。所以它是流中的最后一个 block [从 978 到文件末尾]但我给出了这个异常(exception):偏移量和长度超出了数组的范围,或者计数大于从索引到源集合末尾的元素数。

但为什么呢?从 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

关于c# - BinaryReader,按 block 读取,ArgumentException,偏移量和长度超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com