VB 2010 Hexadezimaler Savegame Editor - Frage

10/19/2018 12:29 suchoo#1
hi, community,

ich habe eine variable SHaxx als string, die folgendermassen sein könnte:

"080000080000080000200000200000"

das möchte ich als hexadezimalwert, so wie es da steht, an das offset (0x20290) einer datei überschreiben.

hier wird die datei geöffnet
Quote:
Private Sub Böffnen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Böffnen.Click
öffnen.Filter = "Nur Spieldateien (*E1T.)|*.E1T"
öffnen.FilterIndex = 1

If öffnen.ShowDialog() = Windows.Forms.DialogResult.OK Then

Dim message As String = öffnen.FileName
MsgBox("die datei wurde als " + message + " geöffnet")
Filename.Text = message

End If
End Sub
hier gespeichert:
Quote:
Private Sub BExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BExport.Click

Dim file As System.IO.StreamWriter

file = My.Computer.FileSystem.OpenTextFileWriter(öffnen.F ileName, True)


file.WriteLine(GlobalVariables.SHaxx)
file.Close()

SaveFileDialog1.Filter = "Nur Spieldateien (*E1T.)|*.E1T"
SaveFileDialog1.Title = "Dump a Savegame File"
If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then

MsgBox("Haxx0red")
End If
End Sub
wie speichere ich die datei korrekt, so dass die offsets im hexadezimalsystem überschrieben werden?
ich glaube das rot muss überartbeitet werden.

Edit: btw welche referenz muss ich lesen, um zu kapieren wie das funktioniert?

lg suchoo
10/19/2018 23:55 SCORNI#2
Als aller aller erstes: Warum VB2010?
Der beste Zeitpunkt auf etwas zeitgemäßes umzusteigen ist am besten schon gestern gewesen.
Lad dir Visual Studio Community runter und steig am besten auf C# 6.0 mit .net Framework 4.6 um.
Mit VB wirst du auf dauer nicht glücklich, da geb ich dir Brief und Siegel drauf.


Solltest du das in Erwägung ziehen, kann ich dir einen Lösungsansatz geben:

Es sei gesagt, dein String mit den Daten als Zeichen ist ganz großer unfung. Daten als HexString zu speichern ist ziemlich bad practice und sollte unter keinen Umständen gemacht werden. In Zukunft solltest du in hinblick auf Speicherverbrauch und Performance binäre Daten immer in einem Bytearray ablegen. Außerdem kann auch keine einzige Funktion im .net Framework mit einem String der Daten in Hexadezimaler Form enthält, etwas anfangen.

Deshalb ist an dieser Stelle Schritt 1, aus dem String ein Bytearray zu erzeugen. Am einfachsten dürfte dies mit Linq gehen:

Code:
String hexData = "080000080000080000200000200000";
byte[] data = Enumerable.Range(0, hexData.Length)//Generiert Zahlen 0 -30
	.Where(x => x % 2 == 0) //Mit den Zahlen 0, 2, 4, 6, 8...
	.Select(x => Convert.ToByte(hexData.Substring(x, 2), 16))//Nimm 2 Zeichen an dieser Position und wandle in ein byte um
	.ToArray();//Als Array zurückgeben
Als nächstes öffnest du deine Datei, damit du einen Stream hast, den du lesen und beschreiben kannst. Dabei nicht vergessen, als dritten Parameter FileAccess.ReadWrite anzugeben, damit du auch Schreibrechte auf die Datei hast.

Code:
FileStream fs = File.Open(@"C:\dein\pfad\zur\date.E1T", System.IO.FileMode.Open, FileAccess.ReadWrite);
Da es die meisten Dateisysteme nicht erlauben mitten in eine Datei zu schreiben, musst du erstmal die ersten 0x20290 Bytes auslesen, um dieser nachher wieder schreiben zu können.

Code:
byte[] firstFileBytes = new byte[0x20290]; //Bytearray initialisieren
fs.Read(firstFileBytes, 0, firstFileBytes.Length);//Aus der Datei ins Bytearray lesen
fs.Position = 0; //Die Position im Stream wieder auf Anfang setzen
Als nächstes hängst du an die ausgelesenen Bytes, deine zu schreibenden Bytes. Dies macht man ebenfalls am einfachsten mit Linq

Code:
byte[] newFirstFileBytes = firstFileBytes.Concat(data).ToArray();
Und zuletzt einfach die neuen Daten in die Datei schreiben und nicht vergessen den Stream ordentlich zu schließen.

Code:
fs.Write(newFirstFileBytes, 0, newFirstFileBytes.Length);
fs.Dispose();

Natürlich gibts hier und da noch möglichkeiten, das ein wenig performanter zu gestalten, aber für den Anfang sollte das die Lösung sein, mit der man mit den wenigsten Zeilen zum gewünschten Ergebnis kommt.

edit: Natürlich kannst du dir auch die Dokumentation von meinen Befehlen ansehen, dort ist meistens neben C# auch der korrekte VB Befehl aufgelistet. Ich denke meine Befehle lassen sich auch mehr oder weniger einfach nach VB migrieren
10/20/2018 14:21 suchoo#3
Danke für die antwort, das ist sehr ausführlich, besser als ich dschte

:)
01/12/2019 01:39 suchoo#4
das ist die csv datei:
[Only registered and activated users can see links. Click Here To Register...]
das ist das formular
[Only registered and activated users can see links. Click Here To Register...]
das ist mein jämmerlicher versuch einen savegameeditor für magic the gathering von 1997 sealed deck tournament zu schreiben
das ist eine solche spieldatei
[Only registered and activated users can see links. Click Here To Register...]

könnte mir jemand helfen, wie das richtig funktionieren kann, bitte?