Folgendes:
Ich habe eine Datei (Save File) in dem ich Hexwerte (mit Hexeditor) ändere, nun wollte ich fragen wie das mit Python geht.
MFG
Hexwerte ändern.
selbst verständlich 
sind ein paar der Möglichkeiten die du hast.

Code: Alles auswählen
"%x" % 0xab
chr(0x20)
"\xff"
binär lesen:
binär schreiben:
MFG
#!/usr/bin/python
fd = file('TEMPLATE.txt', 'rb')
data = fd.read()
print data.encode("HEX")
binär schreiben:
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?file = open("test.bin","wb")
file.write("\x5F\x9D\x3E")
file.close()
MFG
Wie so häufig hilt auch diesmal die Dokumentation.Mr.Wolna hat geschrieben:Ich würde aber gerne, eine Datei öffnen und ein bestimmten Wert in einer bestimmten Position ändern.
- 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.
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.
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.
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.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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.)Mr.Wolna hat geschrieben:ganz ehrlich, ich verstehe nur Bahnhof^^
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

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
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
-
- 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.
-
- 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
-
- 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
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
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
-
- 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).
Oder wie gesagt, construct nutzen.
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:Seek, ist der Anfangspunkt ow er lesen soll read x20 die Stellen nach dem Endpunkt, also so zusagen der Endpunkt. Right?
Jein. Du musst die Datei zum schreiben öffnen und achten dass du genau diese 32 Byte überschreibst. Also hinseeken und genau 32 Byte schreiben.Mr.Wolna hat geschrieben:und wie ändere ich das nun? f.write?
Oder wie gesagt, construct nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice