.IMG Dateien auslesen mit VB.NET [Einfach]

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • .IMG Dateien auslesen mit VB.NET [Einfach]

      Hallo liebe Community,
      heute hab ich mal ein kleines Tutorial vorbereitet, indem ich euch erkläre wie man .img (z.B gta3.img) Dateien ausliest mit VB.NET.

      Als erstes erstellen wir ein Projekt (Windows Form Application). Mein Projekt nenne ich IMG_Tutorial.
      Für das Tutorial benötigen wir einen Button, einen ListView und einen OpenFileDialog.
      Habt ihr das hinzugefügt fangen wir als ersten mit dem Form1_load Event an.
      Dort schreiben wir folgendes rein:

      Quellcode

      1. ListView1.AllowColumnReorder = True
      2. ListView1.View = View.Details
      3. ListView1.FullRowSelect = True
      4. ListView1.Columns.Add("Name", 150, HorizontalAlignment.Left)
      5. ListView1.Columns.Add("Offset", 150, HorizontalAlignment.Left)
      6. ListView1.Columns.Add("Block Size", -2, HorizontalAlignment.left)
      7. OpenFileDialog1.Filter = "IMG-Datei | *.img"


      Über dem Form1_load Event definieren wir noch eine Globale Variabel. Ich nenne sie in dem Tutorial einfach mal "path".

      Quellcode

      1. Dim path as string

      Wenn wir das getan haben erstellen wir einen Private Sub indem wir die Datei schonmal auslesen lassen.
      Fügt unter eurem letztem "End Sub" folgendes hinzu:

      Quellcode

      1. Private Sub readIMG(ByVal PfadDerDatei As String)
      2. Me.Text = ""
      3. Dim bytes(PfadDerDatei.Length - 1) As Byte 'Deklariert die Variable Bytes als Byte und wird direkt beschrieben mit der größe der ausgewählten Datei - 1.
      4. Using fs As New FileStream(PfadDerDatei, FileMode.Open, FileAccess.Read) 'Die Datei wird im FileStream geöffnet und ist nur lesbar!
      5. fs.Read(bytes, 0, bytes.Length) 'Hier werden die kompletten Bytes der Datei gelesen
      6. For i = 0 To 3 'In dieser For schleife werden die ersten 4 Bytes ausgelesen. In den ersten 4 Bytes steht die Version der IMG Datei.
      7. Me.Text += Chr(bytes(i)) 'Bei jeder GTA:SA .img Datei wird hier der Wert "VER2" zurückgegeben. Dieser wird bei uns in den Form Titel geschrieben.
      8. Next
      9. Me.text += " - "
      10. For i = 4 to 7 'In den nächsten 4 Bytes steht die Anzahl der Dateien in der .img Datei. Wählt ihr die Standard gta3.img aus sollte dort stehen: 1696300.
      11. Me.Text += CStr(bytes(i)) 'Das ist natürlich nicht richtig! Hier reicht es wenn ihr statt den 4 - 7 Byte ausliest nur den 4 - 5 Byte! Oder ihr last die letzten nullen einfach entfernen.
      12. Next
      13. Me.text += " Einträge!"
      14. End Using
      15. End Sub
      Alles anzeigen


      So als nächstes kommt das Button1_Click Event an die Reihe.
      Dort lassen wir nun das OpenFileDialog erscheinen sodass wir unsere .img Datei auswählen können.

      Quellcode

      1. If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
      2. path = OpenFileDialog1.FileName
      3. End If
      4. readIMG(path)


      Nun Testen wir unser Programm.
      Das Resultat sollte ungefähr so aussehen:


      Nun wollen wir Natürlich noch den Namen / Offset und die Block Größe auslesen.
      Dazu fügen wir zu unserem readIMG sub unter Me.text += " Einträge!"
      folgendes hinzu:

      Quellcode

      1. For i = 8 To 11
      2. t(1) += CInt(bytes(i))
      3. Next
      4. For i = 12 To 15
      5. t(2) += CInt(bytes(i))
      6. Next
      7. For i = 16 To 39
      8. t(0) += Chr(bytes(i))
      9. Next
      10. ListView1.Items.Add(New ListViewItem(t))

      Und unter fs.Read(bytes, 0, bytes.Length) definiert ihr das array t(2)

      Quellcode

      1. dim t(2) as string


      Am ende sollte das Programm euch folgendes ausgeben wenn ihr die gta3.img öffnet:


      Um die Ganze Datei auszulesen braucht ihr eigentlich nur eine For schleife um die letzten 3 For schleifen zu legen. Und statt for i = 8 to 11 könntet ihr variablen einsetzen so ca:
      for i = Offset to Offest + 4
      t(1) += CInt(bytes(i))
      next
      und ganz am ende bevor die große for schleife zu ende ist addiert ihr einfach 32 zu euere Offset Variable.

      So sollte euer Code aussehen wenn ihr alles gemacht habt wie beschrieben und nur den Ersten Eintrag in der IMG Datei lesen wollt:

      Quellcode

      1. Imports System.IO
      2. Public Class Form1
      3. Dim path As String
      4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      5. ListView1.AllowColumnReorder = True
      6. ListView1.View = View.Details
      7. ListView1.FullRowSelect = True
      8. ListView1.Columns.Add("Name", 150, HorizontalAlignment.Left)
      9. ListView1.Columns.Add("Offset", 150, HorizontalAlignment.Left)
      10. ListView1.Columns.Add("Block Size", -2, HorizontalAlignment.Left)
      11. OpenFileDialog1.Filter = "IMG-File | *.img"
      12. End Sub
      13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      14. If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
      15. path = OpenFileDialog1.FileName
      16. End If
      17. readIMG(path)
      18. End Sub
      19. Private Sub readIMG(ByVal PfadDerDatei As String)
      20. Me.Text = ""
      21. Dim bytes(PfadDerDatei.Length - 1) As Byte
      22. Using fs As New FileStream(PfadDerDatei, FileMode.Open, FileAccess.Read)
      23. fs.Read(bytes, 0, bytes.Length)
      24. Dim t(2) As String
      25. For i = 0 To 3
      26. Me.Text += Chr(bytes(i))
      27. Next
      28. Me.Text += " - "
      29. For i = 4 To 7
      30. Me.Text += CStr(bytes(i))
      31. Next
      32. Me.Text += " Einträge!"
      33. For i = 8 To 11
      34. t(1) += CInt(bytes(i))
      35. Next
      36. For i = 12 To 15
      37. t(2) += CInt(bytes(i))
      38. Next
      39. For i = 16 To 39
      40. t(0) += Chr(bytes(i))
      41. Next
      42. ListView1.Items.Add(New ListViewItem(t))
      43. End Using
      44. End Sub
      45. End Class
      Alles anzeigen


      Hoffe ich konnte euch helfen. Solltet ihr Probleme haben oder Fehler im Tutorial finden könnt ihr das gerne drunter Posten!

      MfG TheTrust3343