Seite 1 von 1

binary data

Verfasst: Mittwoch 10. August 2005, 09:17
von patrickk
Hallo,

ich bekomme binary Data laenge 80 zugeschickt. Kann ich das in eine Datei schreiben?

word =""
i+=1
word = + i

Das waere ja fuer String. Wie mache ich es fuer binary data? Will es spaeter umwandeln, wenn ich es in einer Liste, String... habe


Danke,


Patrick

Verfasst: Mittwoch 10. August 2005, 09:18
von patrickk
In die Datei kommt nat. : send :shock:

Verfasst: Mittwoch 10. August 2005, 11:43
von Leonidas
Ich verstehe deine Frage irgendwie nicht. Du bekommst Daten aus einem Socket. Binärdaten. Diese willst du in eine Datei speichern.

Kein Problem:

Code: Alles auswählen

f = file('datei.bin', 'wb')
f.write(binary_data)
f.close()
Wobei binary_data deine Daten sind.

Verfasst: Mittwoch 10. August 2005, 14:05
von patrickk
Danke,


habe es mittlerweile selbst rausbekommen. Hmm, habe es mit
pickle.dump(data,f) geloest. Deins sieht besser aus...

Patrick

Verfasst: Mittwoch 10. August 2005, 14:33
von Leonidas
Ach du wolltest Daten serialisieren? Ach so! Dann ist pickle tatsächlich besser!

Re: binary data

Verfasst: Mittwoch 10. August 2005, 21:32
von BlackJack
Erstmal meine Hochachtung vor Leonidas hellseherischen Fähigkeiten! Ich habe Deine Frage so ganz und gar nicht verstanden.
patrickk hat geschrieben:Hallo,

ich bekomme binary Data laenge 80 zugeschickt. Kann ich das in eine Datei schreiben?
Als Mail? Klar kannst Du Mails in Dateien speichern. Woher soll man wissen *wie* Du die Daten geschickt bekommst!?
word =""
i+=1
word = + i

Das waere ja fuer String. Wie mache ich es fuer binary data? Will es spaeter umwandeln, wenn ich es in einer Liste, String... habe
Das ist Unsinn. Erst bezeichnet `word` eine leere Zeichenkette, dann erhöhst Du `i` um eins, was nicht geht, weil `i` vorher mal einen Wert zugewiesen bekommen haben muss, damit "um 1 erhöhen" überhaupt Sinn macht. Mal davon abgesehen ersetzt Du in der letzten Zeile die Zeichenkette durch die Zahl `i` mit einem völlig sinnlosen unären ``+`` davor. Falls ``+=`` gemeint war, dann geht das im Regelfall auch nicht, weil man Zahlen nicht mit ``+`` an Zeichenketten anhängen kann.

Wie man das jetzt mit Binärdaten macht? Meine Güte es unzählige Möglichkeiten sinnlosen, ungültigen Code zu schreiben, der mit Binärdaten arbeitet. :twisted:

Wobei Zeichenketten in Python im Grunde Byteketten sind, also Binärdaten.

Das nächste mal bitte etwas mehr Informationen in der Fragestellung, damit man nicht auf Glaskugeln angewiesen ist.

Re: binary data

Verfasst: Mittwoch 10. August 2005, 21:50
von Leonidas
BlackJack hat geschrieben:Erstmal meine Hochachtung vor Leonidas hellseherischen Fähigkeiten!
Vielen Dank, ehrt mich sehr das zu hören, jedoch habe ich nur geraten. Etwas anderes ist bei dieser geringen Menge an Informationen leider nicht möglich gewesen.

Verfasst: Freitag 12. August 2005, 11:31
von patrickk
Hallo,

das mit dem pickle.dump habe ich nur gemacht, weil ich anders nicht weiss wie ich die Daten speichern kann. Wenn mir da jmd einen Tipp geben koennte. Also:

data = pointer auf base64(data)

xml bekomme ich geschickt:
<base64>efeowefhioe==</base64>

data = oben...
wenn print (data), dann wird der code direkt mit base64 decodiert...
kann ich das irgendwie als string speichern?


patrick

Verfasst: Freitag 12. August 2005, 12:46
von Leonidas
Ich würde sagen, dass pickle bzw. YAML die optimalsten Lösungen sind, vor allem wenn es darum geht die Daten auch irgendwann wieder einzulesen.

Verfasst: Sonntag 14. August 2005, 00:20
von BlackJack
patrickk hat geschrieben:data = pointer auf base64(data)

xml bekomme ich geschickt:
<base64>efeowefhioe==</base64>

data = oben...
wenn print (data), dann wird der code direkt mit base64 decodiert...
kann ich das irgendwie als string speichern?
So ganz klar ist mir Dein Problem immer noch nicht.

Was genau hast Du? Eine Zeichenkette mit dem kompletten XML, oder nur die Base64 kodierten Daten, oder schon dekodiert, also Binärstring?

Dekodieren geht ganz einfach:

Code: Alles auswählen

In [8]: 'efeowefhioe=='.decode('base64')
Out[8]: 'y\xf7\xa8\xc1\xe7\xe1\x8a\x87'
Und was genau willst Du als Endergebnis? Die Daten so wie sie kommen einfach nur in eine Datei speichern? Oder vorher dekodieren, falls es noch Base64 ist (siehe oben)?

Irgendwelche binären Daten in einer Zeichenkette in eine Datei speichern geht so:

Code: Alles auswählen

data = 'y\xf7\xa8\xc1\xe7\xe1\x8a\x87'
binfile = open('spam.dat', 'wb')
binfile.write(data)
binfile.close()

Verfasst: Montag 15. August 2005, 08:12
von patrickk
Vielen Dank!

Das hat mich weitergebracht.

Ich glaube ich habe bei base 64 decode etwas falsch gemacht. Jetzt sollte ich base 64 decoded stream haben.
Wie kann man ihn in hex umwandeln? oder was ist das was bei base 64 rauskommt? pickle.dump liefert direkt diesen stream (schon dekodiert...)
Das Problem, warum ich auf hex moechte ist, das ich eine liste von zeichen in binaerfrom bringe, damit ich dann mit einer Tabelle die Zeichen nach asci dekodiere. Leider ist das keine normale Tabelle, daher...

Patrick

Verfasst: Montag 15. August 2005, 23:27
von BlackJack
patrickk hat geschrieben:Ich glaube ich habe bei base 64 decode etwas falsch gemacht. Jetzt sollte ich base 64 decoded stream haben.
Wie kann man ihn in hex umwandeln? oder was ist das was bei base 64 rauskommt?
Wenn man Base64 dekodiert, dann bekommt man das heraus was vorher kodiert wurde. Kodieren kann man alles, d.h. eine beliebige Folge von Bytes.
Das Problem, warum ich auf hex moechte ist, das ich eine liste von zeichen in binaerfrom bringe, damit ich dann mit einer Tabelle die Zeichen nach asci dekodiere.
Das klingt wieder ziemlich wirr. Was verstehst Du unter "hex"? Willst Du am Ende einfach nur eine Ersetzungstabelle auf Bytes anwenden? Dann schau Dir mal die `translate()`-Methode von Zeichenketten an.

Verfasst: Dienstag 16. August 2005, 08:29
von patrickk
Hallo,

leider ist es eine andere Tabelle, als die normale. Desshalb will ich auf bit, aber das klappt. Es sind naemlich 7 bit/ Symbol...
Wie erstellt man am besten selbst eine Tabelle?
ich habe momentan "0001011":"i" (bsp. wert ist bestimmt falsch)
Die Sondezeichen machen so Probleme wie: " oder '
ich koennte aber vielleicht fuer diese zeichen die hex werte nehmen (fuer ascii). acht das sinn? Wenn ich mit str() ausgebe sollte dann ja der ascii wert ausgegeben werden...

Verfasst: Dienstag 16. August 2005, 17:01
von Joghurt
Du hast also das Byte als Binärzahldarstellung, z.B. "101010", und willst jetzt das entsprechende Zeichen in der ASCII-Tabelle, in diesem Falle also das mit der Nummer 42, den "*" haben? Das geht einfach:

Code: Alles auswählen

chr(int("101010",2))
Du kannst int die ZahlBasis übergeben, in die der String ist.

Verfasst: Dienstag 16. August 2005, 21:26
von BlackJack
patrickk hat geschrieben:leider ist es eine andere Tabelle, als die normale.
Was ist denn die "normale" Tabelle?
Desshalb will ich auf bit, aber das klappt. Es sind naemlich 7 bit/ Symbol...
Sind die trotzdem immer in einem Byte gespeichert, d.h. ist das oberste Bit immer 0 oder sind die Werte über Bytegrenzen verteilt?
Wie erstellt man am besten selbst eine Tabelle?
Das kommt ganz darauf an, wie die Daten vorliegen. Was Du immer noch nicht wirklich verraten hast. Wenn es eine Zeichenkette mit 7 Bit pro Byte und einem unbenutztem Bit ist, dann ist die `translate()` Methode von Zeichenketten die effektivste Lösung.