Programmieren - alles kontrollieren 4.938 Themen, 20.667 Beiträge

Will eine Datei so einlesen wei sie ein Hexeditor anzeigt

Teflon / 3 Antworten / Flachansicht Nickles

Hi leute
ich versuch grad ein VBAproggi zu schreiben mit dem man ein par Werte in aus einem Savegame einlesen kann, um diese dann zu verändern.
das prob is das ich den inhalt der datei so brauche wie sie in einem Hexeditor angezeigt wird, nicht unbedingt mit abstand und fixer Zeilenlänge(des krieg ich nacher bei der anzeige schon hin) mir gehts vorerst nur darum die datenaus zulesen
ich hab dazu auch schon nen code der des kann, find den aber total umständlich, gibts da nicht was einfacheres, z.b. open x.y for hex as #1
oder irgendwie kürzer als des
hier is der code:
Public Function Dateiöffnen()
Open Dateiname For Binary As #1
MsgBox ("Die datei: " + Dateiname + "wurde geöffnet")
Dim Liste As String
Dim b As String * 1
Dim c As Integer
Dim d As String

Liste = ""

For x = 1 To 20
Get #1, , b
c = Asc(b) \'buchstabe nach ascitab in zahl
d = Hex(c) \'integer in hexzahl (datentyp der hexzahl ist string)
Liste = Liste + d
Next x

UserForm1.TextBox1.Text = Liste
Close #1
End Function

gruß Teflon

bei Antwort benachrichtigen
(Anonym) Teflon „Danke das funzt jetzt hier is der code mit dems momentan läuft is zwar sau lahm...“
Optionen

Nicht schlecht
ich hab mal ein ähnliches Programm geschrieben um mir Emulator-Files (z.B. vom c64) anzeigen zu lassen. So große Variablen (bytewert(2000000)) brauchen viel Platz. wenn Du weißt wo jeweils die Werte stehen, kannst du mit einem Offset arbeiten also
dim offset as integer
dim dummy as byte
dim bytewert(z.B. 2000)
dann offset errechnen , also die Stelle von wo aus gelesen werden soll
dann :
for i = i to offset
Get #1, , dummy
next i
und dann die gewünschten Werte einlesen
for i = 1 to 2000
Get#1,, bytewert(i)
next i
den offset kannst du immer neu brechnen lassen.

Ich würde auch nicht die Werte vorab in Zeichen speichern, sondern nur bei Bedarf (Anzeige), und die Anzeige dynamisch in einem Listfeld vornehmen
z.b.

Dim az as integer (Anzahl der zeichen in einer Zeile)
dim ze as string (komplette Zeile als string)
listfeld1.clear
az = 0
ze = ""
for i = 1 to 2000
ze = ze + right(("0"+trim(hex(bytewert(i)))),2)+" " (bringt die führende Null und ein Leerzeichen zwischen den Werten)
az = az + 1
if az = 16 then (nach 16 Zeichen neue Zeile)
list1.additem ze
az = 0
ze =""
end if
next i

Damit sparst Du dir das 2. große Array, es wird schneller und sieht aus wie ein Hex-Editor.
Nichts hindert Dich daran an die Zeile ze noch jeweils einen 2. String mit den chr-Werten anzuhängen.Dann zeigts Du Werte und Text

MfG
Rainer



bei Antwort benachrichtigen