Seite 1 von 1
Dateien als hex oder bytes einlesen
Verfasst: Dienstag 18. September 2018, 14:23
von lefrcom
Hallo Allerseits,
Ich versuche gerade spaßeshalber ein kleines skript zu schreiben, mit dem ich Dateien durch Ändern der Bytes verschlüsseln kann. Das habe ich eigentlich auch soweit fertig, was fehlt ist das einlesen der Datei im richtigen Format, sprich die hex oder die decimal zahlen, die ich dann verändern möchte. Ich habe das in der Vergangenheit mal gemacht, so dass ich die Datei am Ende in etwa so
in einer Liste stehen hatte. Nur ist mir entfallen, wie ich das damals gemacht habe und das skript finde ich auch nicht mehr...
kann mir da bitte jmd helfen?
Vielen Dank und schönen Tag!
Re: Dateien als hex oder bytes einlesen
Verfasst: Dienstag 18. September 2018, 15:59
von __blackjack__
@lefrcom: In Python 3 hast Du das bei Binärdateien automatisch, denn da bekommst Du `bytes`-Objekte. Deren Zeichenkettendarstellung ist zwar nicht so wie die einer Liste, aber wenn man über die Elemente iteriert, bekommt man ganze Zahlen von 0 bis 256 pro Elemenent. In Python 2.7 könntest Du Dir den eingebauten `bytearray`-Datentyp anschauen.
Re: Dateien als hex oder bytes einlesen
Verfasst: Mittwoch 19. September 2018, 08:46
von lefrcom
Ah okay, vielen Dank für die Antwort!
Wenn ich aber eine Datei über
einlese, bekomm ich
Code: Alles auswählen
<_io.TextIOWrapper name='DATEI.JPG' mode='w' encoding='cp1252'>
.
Wenn ich das Ganze jetzt so versuche:
Code: Alles auswählen
datei = open('DATEI.PNG', 'w')
b = []
for i in datei:
b.append(i)
bekomme ich eine leere Liste b. Ich glaube ich stehe völlig auf dem Schlauch

Re: Dateien als hex oder bytes einlesen
Verfasst: Mittwoch 19. September 2018, 08:58
von snafu
Der Modus 'w' ist nur zum Schreiben in die Datei gedacht. Wenn du Zeilen aus der Datei lesen willst, so wie du es hier wohl vorhast, dann musst du den Modus 'r' beim Öffnen verwenden. Das ist der Lesemodus (read) und der wird übrigens auch automatisch eingestellt, wenn man die Angabe weglässt.
Ein übliches Pattern zum zeilenweisen Lesen:
Code: Alles auswählen
with open('datei.txt') as source:
for line in source:
# ...
Weitere Infos zum Umgang mit Dateien findest du hier:
https://py-tutorial-de.readthedocs.io/d ... on-dateien
Re: Dateien als hex oder bytes einlesen
Verfasst: Mittwoch 19. September 2018, 09:06
von lefrcom
Okay, das ändert leider nichts, und weiter möchte ich ja die Bytes gezielt verändern um die Datei zu verschlüsseln, muss ich da dann nicht den write-modus benutzen?
Re: Dateien als hex oder bytes einlesen
Verfasst: Mittwoch 19. September 2018, 09:11
von snafu
Man würde dann eher die Bytes aus der Datei in den Speicher lesen mittels read(), die Änderungen vornehmen und sie anschließend wieder zurückschreiben. Entweder in die gleiche Datei oder in eine zweite Datei, je nachdem was du genau bezwecken willst. Jedenfalls muss die dann wieder im 'w'-Modus geöffnet werden.
Ich hatte meinen vorherigen Beitrag editiert und einen Link reingesetzt, der dir beim Umgang mit Dateioperationen helfen soll. Schau da mal rein...
EDIT: Noch was wichtiges, da es sich ja um Binärdaten handelt. Du musst dann 'rb' bzw 'wb' benutzen, sonst bist du im Textmodus, wo die Bytes bereits interpretiert wurden. Und das willst du ja nicht.
Re: Dateien als hex oder bytes einlesen
Verfasst: Mittwoch 19. September 2018, 09:21
von __blackjack__
@lefrcom: Du hast die Datei nicht im Binärmodus geöffnet. Und Binärdateien haben keine Zeilen, das heisst über die Zeilen zu iterieren macht nicht viel Sinn. Da willst Du entweder die gesamte Datei in den Speicher lesen, oder aber blockweise in einer Schleife. Da bietet sich die `iter()`-Funktion mit zwei Argumenten und `functools.partial()` an um sich einen Iterator aus Blöcken zu basteln: ``for block in iter(partial(file.read, 64 * 1024), b''):``. Damit kann man über eine im Binärmodus geöffnete Datei `file` in 64 KiB grossen Blöcken iterieren.
Re: Dateien als hex oder bytes einlesen
Verfasst: Mittwoch 19. September 2018, 10:32
von lefrcom
Oh super, danke an euch alle für die gute und schnelle Hilfe! wirklich toll!
