一次读取文件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;
            }
        }

一次读取文件16个字节

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数组的状态未定义。它可能是零或您的旧值。