Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Will eine Datei so einlesen wei sie ein Hexeditor anzeigt

Teflon / 3 Antworten / Baumansicht 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 „Will eine Datei so einlesen wei sie ein Hexeditor anzeigt“
Optionen

Hallo
das geht etwas einfacher. Mit dem Vwariablentyb byte
also
dim wert as byte
dim a as integer
.
.
for i = 1 to 20
Get#1,,wert
list1 = liste + hex(wert)
next i

besser noch als array

dim wert(20) as byte
dim a as integer
.
.
for i = 1 to 20
get#1,,wert(i)
nexti

damit kannst du dann alles machen, z.B. in einem Listfeld zeigen

bei Antwort benachrichtigen
Teflon (Anonym) „Hallo das geht etwas einfacher. Mit dem Vwariablentyb byte also dim wert as byte...“
Optionen

Danke das funzt jetzt hier is der code mit dems momentan läuft is zwar sau lahm (je nach größe der datei dauert das schon ne weile)aber ich werd ja später nicht die ganze datei in ne Variable lesen sondern nur einzelne werte aus der datei auslesen
Public Dateiname
Public Dateigröße As Integer
Public bytewert(2000000) As Byte '2mile weil mein Savegame 1,9mil b groß is
Public Hexzahl(2000000) As String * 2

Public Function Dateidialog() As String
Dateidialog = Application.GetOpenFilename
End Function

Public Function Dateiöffnen()
Open Dateiname For Binary As #1
MsgBox ("Die datei: " + Dateiname + "wurde geöffnet")
Dim Liste As String
Dim i As Long
i = 0
Liste = ""
Do While Not EOF(1)
i = i + 1
Get #1, , bytewert(i)
If bytewert(i) Hexzahl(i) = "0" + Hex(bytewert(i))
Else
Hexzahl(i) = Hex(bytewert(i))
End If
Liste = Liste + Hexzahl(i)
Loop
UserForm1.TextBox1.Text = Liste
Close #1
End Function

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