Hexwerte ändern.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Folgendes:

Ich habe eine Datei (Save File) in dem ich Hexwerte (mit Hexeditor) ändere, nun wollte ich fragen wie das mit Python geht.

MFG
IoI
User
Beiträge: 68
Registriert: Dienstag 1. Dezember 2009, 11:39

selbst verständlich :D

Code: Alles auswählen

"%x" % 0xab
chr(0x20)
"\xff"
sind ein paar der Möglichkeiten die du hast.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

könntest du mehr darauf eingehen?

sidn das jetzt 3 Möglichkeiten? Was mache ich genau, ich lade die datei im Binärmodus... und dann?

MFG,
Wolna
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mr.Wolna hat geschrieben:Was mache ich genau, ich lade die datei im Binärmodus... und dann?
Was hast du bisher probiert und wo hakt es konkret?
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

binär lesen:
#!/usr/bin/python

fd = file('TEMPLATE.txt', 'rb')
data = fd.read()
print data.encode("HEX")

binär schreiben:
file = open("test.bin","wb")

file.write("\x5F\x9D\x3E")


file.close()
Ich würde aber gerne, eine Datei öffnen und ein bestimmten Wert in einer bestimmten Position ändern. Gibts da paar Beispiele oder gar ein Modul für?

MFG
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mr.Wolna hat geschrieben:Ich würde aber gerne, eine Datei öffnen und ein bestimmten Wert in einer bestimmten Position ändern.
Wie so häufig hilt auch diesmal die Dokumentation.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die Darstellung als Hex ist also vollkommen irrelevant!

Kennst Du den Index? Wenn ja, lies die Datei einfach in eine Liste ein (fileobject.read()) und bastel dann das gewünschte Ergebnis mit Slicing und dem "+"-Operator zusammen.

Wenn nein, müsstest Du ja ein anderes Kritierium haben, anhand dessen Du erkennst, wo Du etwas abändern willst. Dazu müßtest Du dann vermutlich über die Bytes iterieren und nach einem Muster o.ä. suchen und dann an der gefundenen Stelle die Änderung in eine neue Liste eintragen.

Edit: /mes Lösung ist natürlich oftmals schneller - allerdings klappt das nur, wenn sich die Anzahl der Bytes nicht ändert; man kann also nicht anstelle eines bytes zwei neue einfügen.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

ganz ehrlich, ich verstehe nur Bahnhof^^


http://falloutmods.wikia.com/wiki/SAVE.DAT_File_Format

Hier, ist alles wudnerbar Dokumentiert. Ich kann ganz gut mit nem Hex Editor arbeiten. Aber ich würde es gerne per Script ändern und später ne GUI drum herrum bauen.

MFG.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mr.Wolna hat geschrieben:ganz ehrlich, ich verstehe nur Bahnhof^^
Könnte das daran liegen, dass Du die Essenz der Grundlagen immer noch nicht verinnerlicht hast? (Ggf., weil Du Dich eher auf Randprobleme konzentrierst wie z.B. pygame usw.)

Du hast doch nun einige Tipps bekommen. Wieso versuchst Du die nicht umzusetzen? (Man muss ja auch nicht gleich auf einer großen Datei arbeiten, sondern legt sich eben einfach mal eine mit 5 - 10 Bytes an und versucht sich daran. So viel Kreativität solltest Du eigentlich langsam mal mitbringen ;-)
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

genau deswegen mache ich ja das, um von pygame wegzugehen und das grundlegende zu lernen.

Ich verstehe auch deine Ausführungen. Ich brauche nur ein Beispiel.


Wie ich eine Datei binär in ner Liste Lade weiß ich, was slicing ist weiß ich auch, aber wie ich das in diesem speziellen Verfahren anwenden soll ist mir nicht ganz klar.


MFG
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Auf der von dir verlinkten Seite gibt es doch ein paar Tabellen mit Offsets und Größenangaben. `seek`e doch mal an ein Offset und lese von dort die `size` Bytes aus. Oder ändere sie.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Ich verstehe dieses ganzes Fachchinesisch nicht, kann ich ein konkretes Beispiel haben.

Ich lese mir auch die Doc dazu durch, aber mein Englisch hat wohl auch nicht die besten Voraussetzungen. -.-


MFG
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, schwer ist das jetzt wirklich nicht:

Code: Alles auswählen

f = open('save.dat', 'rb')
f.seek(0x1d)
player_name = f.read(0x20)
print player_name
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Code: Alles auswählen

In [1]: with open('foo', 'r+') as f:
   ...:     content = f.read()
   ...:     print content # "hallo"
   ...:     hex(ord('u')) # Hexadezimalwert von u ist 0x75
   ...:     f.seek(2)
   ...:     f.write(chr(0x75)) # u
   ...:     
   ...:     

...

In [2]: !cat foo
haulo
Alternativ könntest du auch einfach die ganze Datei erst in einen String auslesen, den String ändern, und dann den geänderten zurückschreiben, dann brauchst du dieses `seek`en nicht und kannst direkt mit Slices arbeiten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Übrigens ist auch die construct-Library unfassbar nützlich für das Arbeiten mit Binärdateien in Python. Kann ich nur empfehlen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Leonidas hat geschrieben:Naja, schwer ist das jetzt wirklich nicht:

Code: Alles auswählen

f = open('save.dat', 'rb')
f.seek(0x1d)
player_name = f.read(0x20)
print player_name


Okay, verstehe ich das jetz richtig?

Seek, ist der Anfangspunkt ow er lesen soll read x20 die Stellen nach dem Endpunkt, also so zusagen der Endpunkt. Right?

und wie ändere ich das nun? f.write?

MFG
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

hab ich schon erwähnt, dass ich kein gutes englsich kann? :roll:

danke trotzdem ich Kämpfe mich dadurch., aber is nun meine obere Ausführung richtig? Und wenn ,wiso zeigt er trotzdem max x20 wenn ich darübergehe?

MFG
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest wirklich versuchen die Dokumentation zu verstehen (Google Translate und Altavista Babelfish existieren - damit kannst du dir helfen lassen wenn es grad gar nicht weitergeht).
Mr.Wolna hat geschrieben:Seek, ist der Anfangspunkt ow er lesen soll read x20 die Stellen nach dem Endpunkt, also so zusagen der Endpunkt. Right?
Nein, ``seek()`` springt mit dem Dateizeiger an eine bestimmte Position, im dem Fall an 0x1D, also 29 und ließt dort 0x20 = 32 Byte aus.
Mr.Wolna hat geschrieben:und wie ändere ich das nun? f.write?
Jein. Du musst die Datei zum schreiben öffnen und achten dass du genau diese 32 Byte überschreibst. Also hinseeken und genau 32 Byte schreiben.

Oder wie gesagt, construct nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

Beispiele?


entschuldigt, wenn ich mich blöd anstelle. Ich versuch es wirklich zu verstehen.

:oops:

MFG
Antworten