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:
Bild

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:
  1. ich muss mal wieder in haskell programmieren. dein slicing-ansatz ist so viel schöner und verständlicher als das herumgefuchtle mit indices…
  2. es gibt tatsächlich python-libs für binärdaten, wunderbar.
  3. (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.