Bytefolgen in Binärdateien suchen

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
de_tom
User
Beiträge: 15
Registriert: Dienstag 19. Juli 2016, 19:34

Hallo an alle.

Ich habe es mit Binärfiles zu tun, die jeweils ein Jpg-Bild enthalten. Jpg-Bilder beginnen bekanntlich mit der Signatur (Bytefolge) 0xFF 0xD8 0xFF 0xE0, wodurch sie von den meisten Viewern als Jpg-Bild "erkannt" werden.

Bei meinen Binärfiles befinden sich vor dem eigentlichen Jpg-Bild jedoch noch weitere Informationen, sodass die Signatur nicht am Anfang der Datei steht, sondern irgendwo unter den ersten 1000 Bytes. Das Jpg-Bild beginnt also erst an der dortigen Stelle (in jedem Binärfiles an unterschiedlicher Stelle).

Wie kann ich die Binärfiles nach der Bytefolge (o. a. Signatur) durchsuchen und mir den Offset, an dem sie steht, zurückgeben lassen.

Danke für eure Hilfe
Tom
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mal grob skizziert:

Code: Alles auswählen

magic = b'\xff\xd8\xff\xe0'
with open('file.bin', 'rb') as binfile:
    chunk = binfile.read(1000)
start = chunk.index(magic) + len(magic)
de_tom
User
Beiträge: 15
Registriert: Dienstag 19. Juli 2016, 19:34

Bingo! Genau das habe ich gesucht. Und genial schlanker Code! Vielen Dank für die schnelle Antwort.

Vielleicht hast Du mir noch einen Tipp, wie ich das Binärfile dann z. B. ab Offset 27 bis zum File-Ende einlese... bzw. ab Offset 27 bis zum File-Ende in ein neues (Jpg-)File schreibe. Kann ich das mit einem Slice lösen oder gehen Slices nur bei Strings?

Besten Dank schon mal
Tom
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Slices gehen nur bei Sequenzen, wie z.B. Strings, Listen, Tuple, usw.

Für's Springen haben Dateiobjekte die seek()-Methode.
de_tom
User
Beiträge: 15
Registriert: Dienstag 19. Juli 2016, 19:34

Vielen Dank!
Antworten