我正在为我正在研究的FPGA项目编写C#串行接口,我遇到了一个问题。我需要一次读取16个字节的文件,发送16个字节,然后在正确接收时发送接下来的16个字节等。
在调试期间,虽然我在阅读文件时遇到错误:
*(偏移和长度超出数组或计数的范围大于从索引到源集合末尾的元素数。)
该文件大约为1200字节,并且在程序第二次尝试读取16个字节(即文件的字节16-31)时发生错误。
任何想法?是否使用带有计数的偏移量以错误的方式执行此操作?我对高级编程非常缺乏经验,所以你会非常感激
此致 迈克尔
///////////////////// Get file data ///////////////////
else if (fileDataSent == false)
{
FileStream fs = File.OpenRead(tbFileToSend.Text);
try
{
byte[] readBytes = new byte[16];
fs.Read(readBytes, nextReadOffset, 16);
fs.Close();
for (int j = 0; j < 16; j++)
{
sendData[j + 3] = readBytes[j];
}
}
finally
{
fs.Close();
}
nextReadOffset = nextReadOffset + 16;
dataBytesSent = dataBytesSent + 16;
sendData[0] = Convert.ToByte("10000001", 2);
sendData[1] = ByteID;
sendData[2] = Convert.ToByte("11000011", 2);
sendData[19] = Convert.ToByte("11100111", 2);
ByteID++;
if (dataBytesSent == WriteFileSize)
{
fileDataSent = true;
}
}
答案 0 :(得分:0)
fs.Read()中的偏移量被认为是目标数组中的偏移量。在你的情况下,这应该始终为0.文件指针随着每次Read()调用而递增,因此您不必担心这一点。但是,如果没有剩余16个字节用于读取(Read()的返回值),则应考虑这种情况。
答案 1 :(得分:0)
Read
从流中的当前位置读取(打开流时为零)。第二个参数是接收数组中的偏移量,而不是流中的偏移量。
在阅读前使用Seek
设置当前位置。
读取和复制代码我将重写为:
using (FileStream fs = File.OpenRead(tbFileToSend.Text))
{
byte[] readBytes = new byte[16];
fs.Seek(nextReadOffset, SeekOrigin.Begin);
fs.Read(readBytes, 0, 16);
readBytes.CopyTo(sendData, 3);
}
答案 2 :(得分:0)
您正在阅读Stream
,这意味着一旦您读到某些内容,起点将移至Postion =您已阅读的最后一个字节的位置+1。
下次你读到你从那里开始。您无需指定偏移量。事实上,通过这样做,您正在跳过字节。
在某些情况下,您正试图从文件中不存在的位置读取。
所以这样做会很好:
var numberOfBytesActuallyRead = fs.Read(readBytes, 0, 16);
numberOfBytesActuallyRead
告诉您Stream
实际剩余的字节数。然后,您可以决定如何继续。具有索引&gt;的值的readBytes
数组的状态; (numberOfBytesActuallyRead -1)未定义。它可能是零或你的旧价值。