Seite 1 von 1
unpacking
Verfasst: Freitag 21. Januar 2011, 22:53
von flying sheep
ich werd langsam blöd. ich hab hier base64-kodierte big-endian-floats mit 32 bit präzision, aber ich werd nicht mit ihnen fertig. ich muss sie im reißverschlussverfahren auf zwei listen aufteilen (also erstes in liste1, zweites in liste2, drittes in liste1, usw.)
ich hab es mit array wie struct probiert, aber beides funzt nicht so doll. hier mal ein beispiel:
http://www.python-forum.de/pastebin.php?mode=view&s=131
mein code:
Code: Alles auswählen
xdata, ydata = [], []
data = array.array(str("d"), data)
for i in range(0, len(data), 2):
xdata.append(data[i])
ydata.append(data[i+1])
oder:
Code: Alles auswählen
for flo in range(0, len(data)/4, 2):
xdata.append(struct.unpack_from(str(">f"), data, flo))
ydata.append(struct.unpack_from(str(">f"), data, flo+1))
ich vermute stark, dass in ersterem die endianness nicht stimmt oder so, aber ich hab keine ahnung, was im 2. kaputt ist.
kann mir wer helfen?
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 00:05
von Dauerbaustelle
Du versuchst ja auch Floats auszupacken. Du willst aber Integer auspacken.
Code: Alles auswählen
data = '...'.decode('base64')
while data:
chunk, data = data[:4], data[4:]
print struct.unpack('>i', chunk)
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 00:22
von flying sheep
und wieso will ich das? ich will 32-bit-floats, dachte ich zumindest. (steht im obigen post)
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 00:47
von Dauerbaustelle
Uups. Falsch gelesen, sorry! Dann hat das mit dem 'f' doch gestimmt. Was ist denn an deinen Ergebnissen genau falsch?
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 00:53
von flying sheep
die resultierenden daten sollen plots aus einem massenspektrometer sein.
sieht so aus:
das heißt, dass der zweite wert (intensity, y-achse) im wertebereich 0-100 und der erste (m/z, x achse) positiv sein sollten.
aber es kommen negative und absurd hohe werte raus:
(1.9208320643695348e-13,) (862978920415232.0,)
(735.95001220703125,) (3.0136325221974403e-05,)
(-8.526429000960009e+36,) (-205706512.0,)
(693.2738037109375,) (1.1910087499567013e-11,)
(72084398080.0,) (-3.696164054886877e-35,)
(1068.6282958984375,) (-1.3927868922535615e-35,)
(-7.8389454819201933e-27,) (1.6227439324602869e-22,)
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 01:10
von flying sheep
aber da deine hübsche methode funktioniert, wenn man ein "i" durch ein "f" ersetzt nimm ich einfach die. danke!
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 10:13
von Dauerbaustelle
Ich denk mal das Problem bei deiner Funktion war, dass du in 2er-Schritten iteriert hast anstatt in 4er.
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 12:47
von Hyperion
Zudem könnte man beim Iterieren auf islize aus dem itertools-Modul setzen. Damit wäre dann der unschöne Indexvorgriff a la [i+1] unnötig.
Code: Alles auswählen
In [3]: from itertools import islice
In [4]: l = range(10)
In [5]: list(islice(l, 0, None, 2))
Out[5]: [0, 2, 4, 6, 8]
In [6]: list(islice(l, 1, None, 2))
Out[6]: [1, 3, 5, 7, 9]
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 13:05
von Hyperion
Weil ich es grad sah: Vielleicht ist
das hier ja für Dich interessant?
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 13:08
von Leonidas
Hyperion hat geschrieben:Weil ich es grad sah: Vielleicht ist
das hier ja für Dich interessant?
Wenn du sowas suchst, dann werf ich auch noch
construct ins Rennen. Damit habe ich mal ein Custom Binärformat gelesen und geschrieben, hat wirklich überaus gut funktioniert.
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 13:34
von flying sheep
danke für die tips, ich schau mir das alles mal an. ist sicher nicht das letze mal, dass ich mit binärdaten arbeiten muss.
und es war auch nicht das erste mal: ich hab mal ein chinesisches ttc2ttf*-progamm von c++ (eine sprache, die ich nur wenig mehr kann als die chinesischen kommentare) nach python portiert (mit struct). die magic numbers hab ich nicht zu schreiben hingekriegt, aber TeX konnte die ttfs trotzdem lesen (und das ttc davor nicht)
*ttf: true type font; ttc: collection dieser fonts, weil einzelne nur ne begrenzte zahl symbole aufnehmen können.
Re: unpacking
Verfasst: Samstag 22. Januar 2011, 13:55
von flying sheep
Hyperion hat geschrieben:Weil ich es grad sah: Vielleicht ist
das hier ja für Dich interessant?
durch dich sind mir jetzt 3 dinge klar:
- ich muss mal wieder in haskell programmieren. dein slicing-ansatz ist so viel schöner und verständlicher als das herumgefuchtle mit indices…
- es gibt tatsächlich python-libs für binärdaten, wunderbar.
- (wegen deiner sig:) python3 ist ein segen. ich rage jedesmal so hart, wenn schon wieder irgend eine funktion einen string statt unicode haben will, QStrings, die nicht in unicode(QString_variable) gewrappt werden, ascii-encoding-errors schmeißen, print-funktionen failen, …
mit python3 hatte ich halt einfach noch nie so nen fehler.
PS: construct sieht genauso interessant wie biwako aus. ich speichere beide in meinen megabyte-großen firefox-lesezeichen und schau sie mir genauer ann, wenn ich wieder binärdaten lesen will.