无法从文件中读取数据

时间:2019-09-10 06:37:56

标签: vb.net

我正在尝试从文件格式良好的文件中读取数据。我第一次读取成功(获取了前256个字节),但是第二次读取却失败了。

第二个inputFile.Read()之前的参数是:

  

文件长度:2263778

     

bytes2数组长度:768

     

Me.BytesInHeaderRecord - staticHeaderSize读取的字节:768

     

staticHeaderSize偏移(起点):256

   Public Sub New(filePath As String)
        Dim bytesRead As Integer
        Dim inputFile = IO.File.Open(filePath, IO.FileMode.Open, IO.FileAccess.Read)
        Dim bytes() As Byte = New Byte(staticHeaderSize - 1) {} 
        inputFile.Read(bytes, 0, staticHeaderSize) ' <-- This works
        CreateStaticHeader(System.Text.Encoding.UTF8.GetString(bytes))

        Dim bytes2 = New Byte(CInt(Me.BytesInHeaderRecord - staticHeaderSize - 1)) {}
        Dim newLength = CInt(Me.BytesInHeaderRecord - staticHeaderSize)
        'Debug.Print("Filelength: " & CType(inputFile.Length, String))
        'Debug.Print("Array length: " & CType(bytes2.Length, String))
        'Debug.Print("Bytes to read: " & CType(newLength, String))
        'Debug.Print("Offset (starting point): " & CInt(staticHeaderSize))
        inputFile.Read(bytes2, CInt(staticHeaderSize), bytes2.Length) '<-- This does not work
        'Debug.Print("read data: " & System.Text.Encoding.UTF8.GetString(bytes2))
        CreateSignalHeaders(System.Text.Encoding.UTF8.GetString(bytes2))

        inputFile.Close()
    End Sub

CreateStaticHeaderCreateSignalHeaders是用于填充类字段的两个私有子例程-其中之一是Me.BytesinHeaderRecord

但是,当我运行代码时,第二次尝试读取数据时出现异常:

  

System.ArgumentException

     

Message =偏移量和长度超出数组的范围,或者计数为   大于从索引到末尾的元素数量   源集合。

     

在System.IO.FileStream.Read(字节[]数组,Int32偏移量,Int32计数)

MS documentation(C#代替VB.Net,但仍然是.Net框架)的帮助

  

读取(字节[],Int32,Int32)

     

从流中读取一个字节块并将数据写入给定   缓冲。

     

参数

     

数组

     

字节[]

     

此方法返回时,包含指定的字节数组,并带有   偏移量与(偏移量+计数-1)之间的值替换为字节   从当前来源读取。

     

偏移量

     

Int32

     

将放置读取字节的数组中的字节偏移。

     

计数

     

Int32

     

要读取的最大字节数。

据我所知,我正在调用正确的代码。

编辑

使用的数字通过提供的调试代码确认。

        'Debug.Print("Filelength: " & CType(inputFile.Length, String))
        'Debug.Print("Array length: " & CType(bytes2.Length, String))
        'Debug.Print("Bytes to read: " & CType(newLength, String))
        'Debug.Print("Offset (starting point): " & CInt(staticHeaderSize))

1 个答案:

答案 0 :(得分:-1)

答案在于MS文档的帮助(OP中的链接)。 “偏移量”与读取的数据存储在提供的数组中的位置有关,在这种情况下,要读取的字节数超过了数组的末尾。

但是,误解是可以理解的,因为从文件中的偏移量开始读取肯定比偏移数组中要存储字节的位置更直观,在所有示例中,代码都是专门针对该读取声明的。这里的教训是,相信直觉而不是仔细阅读文档会充满危险!

  

Read(Byte [],Int32,Int32)

     

从流中读取一个字节块并将数据写入给定   缓冲。

     

字节[]

     

此方法返回时,包含指定的字节数组   偏移量与(偏移量+计数-1) 之间的   阅读

     

偏移量

     

Int32

     

数组中的字节偏移量

     

计数

     

Int32

     

要读取的最大字节数。