Seite 1 von 1

Binary-File als Hex-Darstellung

Verfasst: Sonntag 19. Oktober 2008, 21:48
von maxxle
Habe gerade etwas mit einem Binär-File, das ich unter C erstellt habe gespielt.
In das Bin-File habe ich ein C-Struct bestehend aus zwei Integern geschrieben.

Ich habs mit folgendem gemacht (aboslut Quickhack):

Code: Alles auswählen

#!/bin/python

import binascii;

myFile = open("test.bin", 'r');
a=1;

while a:
    a = myFile.read(1);
    b= binascii.hexlify(a);
    print b;

myFile.close();

Ziel war es, jedes Byte des Binär-Files in Hexadezimaler-Schreibweise einzeln darzustellen.
Wie würdet ihr soetwas zerlegen? Geht es noch einfacher?
Wie würdet ihr sowas in Perl zerlegen?

Verfasst: Sonntag 19. Oktober 2008, 22:07
von EyDu
Anweisungen in Python brauchst du nicht mit einem Semikolon abschließen, das ist vollkommen überflüssig.

Außerdem solltest du eine Datei, welche binärdaten enthält, mit "rb" öffnen und nicht nur mit "r". Zumindest unter Windows macht dies einen Unterschied.

Dein Programm kann man auch noch wesentlich kürzer fassen:

Code: Alles auswählen

import binascii

with open("test.bin", "rb") as fp:
    print binascii.hexlify(fp.read())
Dann steht zwar nicht mehr jedes Byte in einer neuen Zeile, das lässt sich aber leicht anpassen.

Verfasst: Sonntag 19. Oktober 2008, 22:16
von lunar
Das "binascii"-Modul ist nicht nötig, es gibt einen Codec namens "hex", der zusammen mit der ".encode()"-Methode von Strings verwendet werden kann:

Code: Alles auswählen

with open('test.bin', 'rb') as stream:
    print stream.read().encode('hex')
Abhängig von der erwarteten Größe der Datei ist es allerdings mitunter nicht empfehlenswert, die gesamte Datei in den Speicher zu lesen.

Verfasst: Sonntag 19. Oktober 2008, 23:09
von maxxle
Danke für die Antworten. Das mit Encode gefällt mir noch besser wie der "binascii"-import.
Werde mir binascii aber im Hinterkopf halten. Die eine oder andere Funktion aus diesem Paket kann durchaus nützlich sein.