Błąd odczytywania niestniejącego bajtu z pliku.

0

Witam
Mój program odczytuje bajty z komórek &H1E oraz &H1F. Problem jest w tym, że jeżeli załaduje do niego mniejszy plik (który nie zawiera tego adresu) to program zwaraca do mnie się takim błędem.

Szczegółowe informacje na temat wywoływania debugowania w trybie JIT (just in time)
zamiast tego okna dialogowego znajdują się na końcu tego komunikatu.

************** Tekst wyjątku **************
System.IndexOutOfRangeException: Indeks wykraczał poza granice tablicy.
   w WindowsApplication1.Form1.Button1_Click(Object sender, EventArgs e)
   w System.Windows.Forms.Control.OnClick(EventArgs e)
   w System.Windows.Forms.Button.OnClick(EventArgs e)
   w System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   w System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   w System.Windows.Forms.Control.WndProc(Message& m)
   w System.Windows.Forms.ButtonBase.WndProc(Message& m)
   w System.Windows.Forms.Button.WndProc(Message& m)
   w System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   w System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   w System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Zestawy załadowane **************
mscorlib
    Wersja zestawu: 4.0.0.0
    Wersja Win32: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
WindowsApplication1
    Wersja zestawu: 1.0.0.0
    Wersja Win32: 1.0.0.0
    CodeBase: file:///C:/Users/Kamil/Desktop/WindowsApplication1.exe
----------------------------------------
Microsoft.VisualBasic
    Wersja zestawu: 10.0.0.0
    Wersja Win32: 12.0.51209.34209 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System.Windows.Forms
    Wersja zestawu: 4.0.0.0
    Wersja Win32: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Wersja zestawu: 4.0.0.0
    Wersja Win32: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    Wersja zestawu: 4.0.0.0
    Wersja Win32: 4.0.30319.34238 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Runtime.Remoting
    Wersja zestawu: 4.0.0.0
    Wersja Win32: 4.0.30319.34245 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
mscorlib.resources
    Wersja zestawu: 4.0.0.0
    Wersja Win32: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_pl_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
System.Windows.Forms.resources
    Wersja zestawu: 4.0.0.0
    Wersja Win32: 4.0.30319.34209 built by: FX452RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_pl_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** Debugowanie w trybie JIT **************
Aby włączyć debugowanie w trybie just in time (JIT), plik .config tej
aplikacji lub komputera (machine.config) musi mieć
wartość jitDebugging ustawioną w sekcji system.windows.forms.
Aplikacja musi być również skompilowana z włączonym
debugowaniem.

Na przykład:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

Gdy debugowanie JIT jest włączone, wszystkie nieobsługiwane wyjątki
są wysyłane do debugera JIT zarejestrowanego na komputerze
i nie są obsługiwane w tym oknie dialogowym.

Czy da radę jakoś zapobiec takim sytuacją ?

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim OFD As New OpenFileDialog
            Dim fullFile() As Byte
            With OFD
                .Filter = "Binary files (*.bin)|*.bin"
            End With

            If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then
                fullFile = File.ReadAllBytes(OFD.FileName)
                If fullFile(&H10) <> 26 Then
                    MsgBox("bad file")
                End If
                TextBox1.AppendText(fullFile(&H1E).ToString("X2") & " ")
                TextBox1.AppendText(fullFile(&H1F).ToString("X2"))
            End If

dodanie znacznika <code class="vbnet"> i zamiana <quote> na <code> - @furious programming

0

No przecież możesz wcześniej sprawdzić wielkość (jeszcze przed sprawdzeniem tego bajtu czy 26 i tam także Exit Sub)

                If (fullFile.Length < &H1F) Then
                    MsgBox("bad file size")
                    Exit Sub
                End If

Poza tym od czego zaimplementowano obsługę wyjątków

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim OFD As New OpenFileDialog
        Dim fullFile() As Byte
        Try
            OFD.Filter = "Binary files (*.bin)|*.bin"
            If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then
                fullFile = File.ReadAllBytes(OFD.FileName)
                If (fullFile.Length < &H1F) Then
                    Throw New System.Exception("bad file size")
                End If
                If (fullFile(&H10) <> 26) Then
                    Throw New System.Exception("bad file")
                End If
                TextBox1.AppendText(fullFile(&H1E).ToString("X2") & " ")
                TextBox1.AppendText(fullFile(&H1F).ToString("X2"))
            End If
        Catch ex As Exception
            MsgBox("Error: " & ex.Message)
        End Try
    End Sub
0

Część ze sprawdzaniem plików działa wyśmienicie.
Natomiast tutaj pojawia się problem

If (fullFile(&H10) <> 26) Then
  Throw New System.Exception("bad file")
End If

Niezależnie od tego czy w adresie H10 znajduje się wartość 26 czy inna wartość to zawsze wyświetlana jest msgbox "bad file"

`poprawnie znacznika i dodanie ``` - @furious programming

0

Ok wystarczyło w kodzie podać wartość dziesiętną. 26 = 38

1 użytkowników online, w tym zalogowanych: 0, gości: 1