C# 一次读取16字节的文件

C# 一次读取16字节的文件,c#,C#,我正在为正在进行的FPGA项目编写C#串行接口,我遇到了一个问题。我需要一次读取16个字节的文件,发送16个字节,然后在正确接收后发送接下来的16个字节,等等 在调试期间,虽然我在读取文件时出错,但是: *(偏移量和长度超出了数组的界限,或者计数大于从索引到源集合末尾的元素数。) 该文件约为1200字节,错误发生在程序第二次尝试读取16字节(即文件的16-31字节)时 有什么想法吗?使用带有计数的偏移量是否是错误的方法?我对高级编程非常缺乏经验,因此非常感谢您的帮助 问候,, 迈克尔 //获取文

我正在为正在进行的FPGA项目编写C#串行接口,我遇到了一个问题。我需要一次读取16个字节的文件,发送16个字节,然后在正确接收后发送接下来的16个字节,等等

在调试期间,虽然我在读取文件时出错,但是:

*(偏移量和长度超出了数组的界限,或者计数大于从索引到源集合末尾的元素数。)

该文件约为1200字节,错误发生在程序第二次尝试读取16字节(即文件的16-31字节)时

有什么想法吗?使用带有计数的偏移量是否是错误的方法?我对高级编程非常缺乏经验,因此非常感谢您的帮助

问候,, 迈克尔

//获取文件数据///////////////////
else if(fileDataSent==false)
{
FileStream fs=File.OpenRead(tbFileToSend.Text);
尝试
{
字节[]读取字节=新字节[16];
fs.Read(readBytes,nextradafset,16);
fs.Close();
对于(int j=0;j<16;j++)
{
sendData[j+3]=读取字节[j];
}
}
最后
{
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++;
如果(DataByteSent==WriteFileSize)
{
fileDataSent=true;
}
}

fs.Read()中的偏移量被视为目标数组中的偏移量。在您的情况下,该值应始终为0。文件指针随着每次Read()调用而递增,因此您不必担心这一点。但是,当读取时不存在16字节(返回值(读数))时,应该考虑这个情况。

<代码>代码> Read <代码>从流中的当前位置读取(在打开流时为零)。第二个参数是接收阵列中的偏移量,而不是流中的偏移量

用于在读取前设置当前位置

阅读和复制代码时,我将重写为:

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);
}

您正在从
流中读取,这意味着一旦您读取了某个内容,起点将移动到Position=您读取的最后一个字节的位置+1

下次你读的时候,你就从那里开始。不需要指定偏移量。实际上,这样做是在跳过字节

在您的情况下,您试图从文件中不存在的位置读取

这样就可以了:

var numberOfBytesActuallyRead = fs.Read(readBytes, 0, 16);

numberOfBytesActuallyRead
告诉您
流中实际剩下多少字节。然后您可以决定如何继续。未定义索引为>(numberOfBytesActuallyRead-1)的值的
readBytes
数组的状态。它可能是零或您的旧值。

谢谢各位,非常感谢。这是否意味着每次我打开流时:(FileStream fs=File.OpenRead(tbFileToSend.Text);)文件指针将默认为零?同样,在EOF情况下,字节数小于16。readBytes[]是否会在没有数据可读取的情况下充满零?或者我会得到某种错误?@MichaelAlllen771关于返回的数组,没有定义索引大于实际读取字节的值的状态,它可能仍然是旧值或零或完全不同的值。谢谢,我将在调试中付出一些努力来验证返回数组的内容。非常感谢。@MichaelAlllen771实际上你不应该,无论返回什么,我都会随框架的任何更新而更改,当某些内容未定义时,它确实是未定义的,你不应该以任何方式依赖它。谢谢大家,非常感谢。这是否意味着每次我打开流时:(FileStream fs=File.OpenRead(tbFileToSend.Text);)文件指针将默认为零?同样,在EOF情况下,字节数小于16。readBytes[]是否会在没有数据可读取的情况下充满零?或者我会得到某种错误吗?@MichaelAlllen771根据,
Read
返回实际读取的字节数(因此实际复制到目标数组中),如果没有更多的字节数,则返回的字节数可以小于请求的字节数。见备注部分。谢谢各位,非常感谢。这是否意味着每次我打开流时:(FileStream fs=File.OpenRead(tbFileToSend.Text);)文件指针将默认为零?同样,在EOF情况下,字节数小于16。readBytes[]是否会在没有数据可读取的情况下充满零?还是我会犯错误?谢谢你们,你们在stackoverflow上是救命恩人!
var numberOfBytesActuallyRead = fs.Read(readBytes, 0, 16);