Hexdezimalfile lesen und inhalt zu dezimal zahlen umwandeln

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.
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Hallo ihr zusammen,

bitte entschuldigt meine frage, ich bin was programmieren angeht nicht sehr fitt, ich will es unbedingt lernen.
so es geht darum dass ich eine Hex-Datei lesen möchte und den inhalt in dezimal Zahlen konvertieren will.

so sieht der Inhalt aus:

0x0000000: EDF301C85A4EBCC726C9BF47ED6670C8
0x0000001: 686FEFC64CFF6F47983AA5466D6709C8
0x0000010: DAF2AAC768E7F8C6B42820C7985AAC46

so sieht der Inhalt aus, mein Ziel ist dieser inhalt in einem Array zu speichern, damir es so aussieht ["0: 237","1: 104","2: 70"]:(

Ich hoffe dass ihr mir helfen könnt.

Vielen Dank im Voraus
Liebe Grüße
Marie
deets

Deine gewuenschte Ausgabe macht so ueberhaupt keinen Sinn. Aber wie dem auch sei - die Funktionen, die du brauchst sind

Code: Alles auswählen

print int("ABCEDF", 16)
sowie die diversen string-Methoden zum zerteilen eines Strings.

Am besten faengst du so an, dass du eine Zeile deiner Datei als Variable deklarierst, und dann erstmal eine Funktion baust, die das gewuenschte Ergebnis berechnet. Dann verbindest du das mit dem einlesen der Datei, und bist fertig.

Code: Alles auswählen


def tuwas(line):
     ...

zeile = "0x0000000: EDF301C85A4EBCC726C9BF47ED6670C8"
print tuwas(zeile)
   
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo und herzlich Willkommen im Forum!

Schau Dir mal die Built-in Funktion `int` an. Da kannst Du als optionalen Parameter die Basis angeben. Eine Hexadezimalzahl entspricht folglich der Basis 16:

Code: Alles auswählen

In [21]: int("ED", 16)
Out[21]: 237
Nun musst Du eigentlich nur noch über die Quelldaten iterieren und die Umwandlung vornehmen.

Kurze Frage noch zur Datenstruktur: Bist Du Dir sicher, dass Du dieses Stringformat in einer Liste speichern möchtest? Denn einen Index kann man bei einer Liste immer leicht per `enumerate` generieren...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Vielen Dank für die schnelle Antwort.

Das Problem ist dass ich die Datei mit dem befehl:
ReadFile = open(infile, 'rb') lese, aber ich kann den Inhalt nicht wie der in der Datei steht lesen:
auf der standardausgabe kommt so ein Text raus:

"È‚ È¹È tXÆ|}ÇGø”2GüõÓGøøXGÐÆ ÌÆ„›´Ç|¾šGLÂÆäÞÆÎ&ÈnȘ°È/¥½ÇÑ&ÀGØXoȼ íÆ¢ÊpGD‘¨F˜q È/¨©Ç¼®üÆ^]#ÇD׫F ZiE¼ð±ÆQŸ¥G¯•„

Ist es normal? die erste Frage ist nähmlich wie gebe ich diese Hex-Datei so aus wie sie tatsächlich aussiieht?

Danke noch mal
Marie
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso willst Du eine Textdatei binär öffnen?

Zudem solltest Du das `with open as`-Idiom nutzen:

Code: Alles auswählen

with open(filename, "r") as infile:
    # infile ist hier das offene File-Objekt.
Damit wird die Datei verlässlich automatisch geschlossen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Hallo Hyperie,

ich habe mir ehrlich gesagt keine große Gedanken gemacht wie ich das am besten speichern soll(noch eine Anfängerin). Ich will aber der Inhalt in einer Reihe speicher, und durch den Index darauf zugreifen.
LG
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hyperion ;-) Hyperie klingt ja wie Hysterie :-D

Also Du schlägst das vor:

Code: Alles auswählen

In [23]: result = ["0: 237","1: 104","2: 70"]

In [24]: result[0]
Out[24]: '0: 237'
Wie kommst Du denn jetzt an die "237", welche da er eigentliche Datenwert ist? Und was nützt Die die "0" in dem Datum? Du musst ja *vorher* den Index kennen, ansonsten kannst Du nicht drauf zugreifen. Außerdem stehen da jetzt lauter Strings in der Liste - Du willst ja aber wohl einen Integerwert haben...

Und Indizes generieren kann man nachträglich immer:

Code: Alles auswählen

In [26]: for index, value in enumerate(["Python", "Boa", "Natter"]):
   ....:     print(index, value)
   ....:     
0 Python
1 Boa
2 Natter
Da wir ja nicht wissen, was Du später mit den umgewandelten Werten machen willst, können wir hier nur allgemein zu einer einfachen Liste raten:

Code: Alles auswählen

In [27]: result = [237, 104, 70]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Ja war nur ein Verzeiwefelungsmoment, weil ich auch mit "r" auch ganz komische zeichenketten gekriegt habe:
das kommt raus wenn ich das mit
with open(filename, "r") as infile:
File = infile.readline()
print(File)

Erste Zeile : "ÈÚòªÇhçøÆ´( ǘZ¬FÀÄiEhA³Æ&a¥GÚJ†Ç¦ùƒG´ý ÇZ¦·Ç´G,Ç&T‚G¦õëGL‹!GL*vGSå"

Ist das Normal? was soll noch geändert werden deiner Meinung nach?

Vieln Dank im voraus
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, ich ahne was... Du hast gar keine Textdatei wie oben von Dir geschildert, sondern Du hast eine Datei mit binärem Inhalt! Das ist aber etwas ganz anderes als eine Datei mit hexadezimalen Zahlen!

Dann musst Du diese Datei natürlich im binären Modus öffnen. Dann kannst Du ja einfach mit den gängigen File-Objekt-Methoden auf die Bytes zugreifen.

Benutzt Du Python 2.x oder 3.x? Auch das könnte hier bedeutend werden.

Und zu guter letzt: Beschreibe doch mal bitte gloaber, was Du eigentlich erreichen willst! (Musikdaten bearbeiten, Bildverarbeitung, o.ä.) Ich habe das Gefühl, wie lösen hier ein XY-Problem und das sollten wir schnell abklären.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Ja Liste ist auch die beste Möglichkeit in diesem Fall, nur ich kann den Inhalt nicht lesen. Und oben war kein "o" sondern eine 0, ich habe mich vertippt.
aber meine Hauptfrage ist wie kann ich diese Datei so lesen wie ich den inhalt sehe. diese Datei kann ich nur mit einem Hex-taxteditor aufmachen.
BlackJack

@Marie: Deine Frage macht immer noch nicht viel Sinn. Wie siehst Du denn den Inhalt? Wenn man nichts weiter über die Daten weiss, dann sind das einfach Bytes. Wie genau möchtest Du Die denn interpretieren? Einfach als Zahlen zwischen 0 und 255? Dazu kannst Du die einzelnen Bytes mit der `ord()`-Funktion umwandeln.
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Ja Hyperion, Du hast Recht, sorry aufgrund der fehleende Erfahrung kann ich mein Problem manchmal nicht gut beschreiben.
So das ist eine Datei mit binärem Inhalt, die Datei beinhaltet "eeg-werte". Die Werte müssen dann geplottet werden, aber das ist der nächste Schritt.
Ich benutze Python 2.7.2 für andere Fragen stehe ich zur Verfügung
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Marie hat geschrieben: So das ist eine Datei mit binärem Inhalt, die Datei beinhaltet "eeg-werte".
Sind das Daten aus dem medizinischen "EEG"? Ein anderes EEG kenne ich nicht ;-)

Bevor Du da ran gehst, wäre es sinnvoll das genau Format zu kennen! Gibt es da vom Gerätehersteller des EEGs nicht eine Spezifikation? Oder gibt es evtl. Tools vom Hersteller, diese Daten in irgend ein anderes Format zu konvertieren (welches sich dann ggf. leichter parsen lässt)? Oder ist das Format wirklich absolut trivial und beherbergt keine Metainformationen oder nur fixe in einer Art Header? Evtl. gibt es dafür auch schon ein Python-Modul, welches diese Arbeit erledigt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Ja Hyperion, das ist der medizinische EEG. Die Datei hat die Endung ".eeg" und genau wie Dues beschrieben hast, es ist wirklich absolut trivial und fix in einer Art Header.

Ich bin verzweifelt, ich weiß nicht wie es weiter geht:(
deets

@Marie

Ohne mehr Details zu dem Format kann dir da keiner helfen. Die Dateiendung "eeg" ist nun alles andere als gelaeufig... du musst schon mit Dokumentation darueber herausruecken, wie die Datei aufgebaut ist. Das sollte der Hersteller irgendwie beibringen. Und danach vermute ich mal ist das Modul struct hilfreich, um die Binaerwerte in entsprechende Datentypen zu wandeln, welche dann matplotlib oder so verarbeiten kann.
BlackJack

@Marie: Mit dem Kenntnissstand geht es wahrscheinlich gar nicht weiter. Ich glaube nämlich kaum dass die Daten in den einzelnen Bytewerten und ohne jegliche Metainformation in der Datei stecken. Man müsste also das Format der Datei kennen oder erraten können.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wo ist denn jetzt das Problem? Du öffnest die Datei wie besprochen und liest die Werte in eine Liste ein:

Code: Alles auswählen

with open(filename, "rb") as infile:
    data = infile.read()
Wenn Du weißt, wie groß der Header ist, kannst Du mit `file.seek` den Anfang überspringen, um bis zu den eigentlichen Daten "vorzuspulen".

Aber wie die anderen schon sagten ist das jetzt schon ziemlich spekulativ.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Ja ihr habt Recht.

ich habe vorhin etwas kleines erreicht:

Code: Alles auswählen

infile = "blabla.eeg"
     
ReadFile = open(infile, 'rb')
print "Name of the file :", ReadFile.name
for line in infile:
    line = ReadFile.read(32)
    data= struct.unpack("<H", line[0:2])
    
print data
die Ausgabe war dann:

Code: Alles auswählen

Name of the file : blabla.eeg
(63220,)

ehrlich gesagt weiß ich nicht was die "unpack("<H", line[0:2])" macht und habe auch nicht verstanden was diese Zahl (63220, ) zu bedeuten?

vielleicht könnt ihr mir das erklären?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Marie hat geschrieben:Ja ihr habt Recht.
Ok, das war die "Einsicht" - aber wo bleiben denn jetzt die angefragten Infos?

Wieso benutzt Du nicht das von mir gezeigte Idiom zum Öffnen von der Datei? Es gibt gute Gründe für die Benutzung von `with` in diesem Kontext!
Marie hat geschrieben: ehrlich gesagt weiß ich nicht was die "unpack("<H", line[0:2])" macht und habe auch nicht verstanden was diese Zahl (63220, ) zu bedeuten?
Wo hast Du das denn her? Das fällt ja nicht vom Himmel ;-) Ich würde Dir eben raten, Dir die Doku zum `struct`-Modul anzugucken.

Aber letztlich bringt das ja auch erst dann etwas, wenn Du mehr über das Format an sich weißt. Ggf. gibt es dann auch andere, bessere Module zum Parsen Deines Formates. Zu diesem Thema hatten wir unlängst einen Beitrag.

Aber zu diesem Format sind ja auch noch zig Fragen offen. s.o. und in vielen vorangegangenen Postings.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Marie
User
Beiträge: 35
Registriert: Freitag 25. November 2011, 15:22

Ja Du hast schon wieder Recht, ich weiß nicht wo ich die gefragten Details über dei Datei holen soll.
Ok danke für die Empfehlung, ich werde "with" einsetzen:)

Ich werde noch weiter lesen und melde mich noch mal:(
Antworten