binary data

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.
Antworten
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
patrickk

In die Datei kommt nat. : send :shock:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
Zuletzt geändert von Leonidas am Mittwoch 10. August 2005, 21:48, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
patrickk

Danke,


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

Patrick
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ach du wolltest Daten serialisieren? Ach so! Dann ist pickle tatsächlich besser!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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()
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
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.
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...
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
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.
Antworten