Dateien als hex oder bytes einlesen

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.
Antworten
lefrcom
User
Beiträge: 8
Registriert: Dienstag 18. September 2018, 14:04

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

Code: Alles auswählen

datei = [255, 0, 34, 54, etc.] 
in einer Liste stehen hatte. Nur ist mir entfallen, wie ich das damals gemacht habe und das skript finde ich auch nicht mehr... :roll:
kann mir da bitte jmd helfen?
Vielen Dank und schönen Tag!
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
lefrcom
User
Beiträge: 8
Registriert: Dienstag 18. September 2018, 14:04

Ah okay, vielen Dank für die Antwort!
Wenn ich aber eine Datei über

Code: Alles auswählen

open('datei', 'w')
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 :roll:
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Zuletzt geändert von snafu am Mittwoch 19. September 2018, 09:07, insgesamt 1-mal geändert.
lefrcom
User
Beiträge: 8
Registriert: Dienstag 18. September 2018, 14:04

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?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
lefrcom
User
Beiträge: 8
Registriert: Dienstag 18. September 2018, 14:04

Oh super, danke an euch alle für die gute und schnelle Hilfe! wirklich toll! :)
Antworten