一次读取文件16个字节
本文关键字:文件 16个 字节 读取 一次 | 更新日期: 2023-09-27 18:28:02
我正在为正在进行的FPGA项目编写C#串行接口,遇到了一个问题。我需要一次读取16个字节的文件,发送16个字节,然后在正确收到后发送下一个16个字节等。
在调试期间,尽管我在读取文件时遇到了错误,但:
*(偏移量和长度超出了数组的界限,或者计数大于从索引到源集合末尾的元素数。)
该文件大约为1200字节,并且错误发生在程序第二次尝试读取16字节(即文件的字节16-31)时。
有什么想法吗?使用带计数的偏移量是错误的方法吗?我在高级编程方面非常缺乏经验,所以你的帮助将非常感谢
谨致问候,Michael
///////////////////// 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;
}
}
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);
}
fs中的偏移量。Read()被认为是目标数组中的偏移量。在你的情况下,这将永远是0。文件指针随着每次Read()调用而递增,因此您不必担心这一点。但是,您应该考虑没有16个字节可供读取的情况(Read()的返回值)。
您正在从Stream
读取,这意味着一旦您读取了某个内容,起点就会移动到您读取的最后一个字节的Postion=位置+1。
下次你读的时候,你要从那里开始。您不需要指定偏移。事实上,这样做是在跳过字节。
在您的情况下,在某个时刻,您正试图从文件中不存在的位置进行读取。
所以这会做得很好:
var numberOfBytesActuallyRead = fs.Read(readBytes, 0, 16);
numberOfBytesActuallyRead
告诉Stream
中实际剩余了多少字节。然后您可以决定如何继续。索引>(numberOfBytesActuallyRead-1)的值的readBytes
数组的状态未定义。它可能是零或您的旧值。