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:
ListView1.AllowColumnReorder = True
ListView1.View = View.Details
ListView1.FullRowSelect = True
ListView1.Columns.Add("Name", 150, HorizontalAlignment.Left)
ListView1.Columns.Add("Offset", 150, HorizontalAlignment.Left)
ListView1.Columns.Add("Block Size", -2, HorizontalAlignment.left)
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".
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:
Private Sub readIMG(ByVal PfadDerDatei As String)
Me.Text = ""
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.
Using fs As New FileStream(PfadDerDatei, FileMode.Open, FileAccess.Read) 'Die Datei wird im FileStream geöffnet und ist nur lesbar!
fs.Read(bytes, 0, bytes.Length) 'Hier werden die kompletten Bytes der Datei gelesen
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.
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.
Next
Me.text += " - "
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.
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.
Next
Me.text += " Einträge!"
End Using
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.
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
path = OpenFileDialog1.FileName
End If
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:
For i = 8 To 11
t(1) += CInt(bytes(i))
Next
For i = 12 To 15
t(2) += CInt(bytes(i))
Next
For i = 16 To 39
t(0) += Chr(bytes(i))
Next
ListView1.Items.Add(New ListViewItem(t))
Und unter fs.Read(bytes, 0, bytes.Length) definiert ihr das array t(2)
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:
Imports System.IO
Public Class Form1
Dim path As String
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ListView1.AllowColumnReorder = True
ListView1.View = View.Details
ListView1.FullRowSelect = True
ListView1.Columns.Add("Name", 150, HorizontalAlignment.Left)
ListView1.Columns.Add("Offset", 150, HorizontalAlignment.Left)
ListView1.Columns.Add("Block Size", -2, HorizontalAlignment.Left)
OpenFileDialog1.Filter = "IMG-File | *.img"
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
path = OpenFileDialog1.FileName
End If
readIMG(path)
End Sub
Private Sub readIMG(ByVal PfadDerDatei As String)
Me.Text = ""
Dim bytes(PfadDerDatei.Length - 1) As Byte
Using fs As New FileStream(PfadDerDatei, FileMode.Open, FileAccess.Read)
fs.Read(bytes, 0, bytes.Length)
Dim t(2) As String
For i = 0 To 3
Me.Text += Chr(bytes(i))
Next
Me.Text += " - "
For i = 4 To 7
Me.Text += CStr(bytes(i))
Next
Me.Text += " Einträge!"
For i = 8 To 11
t(1) += CInt(bytes(i))
Next
For i = 12 To 15
t(2) += CInt(bytes(i))
Next
For i = 16 To 39
t(0) += Chr(bytes(i))
Next
ListView1.Items.Add(New ListViewItem(t))
End Using
End Sub
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