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

binary data

Beitragvon patrickk » Mittwoch 10. August 2005, 09:17

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

Beitragvon patrickk » Mittwoch 10. August 2005, 09:18

In die Datei kommt nat. : send[i] :shock:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 10. August 2005, 11:43

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 Modvoice
patrickk

Beitragvon patrickk » Mittwoch 10. August 2005, 14:05

Danke,


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

Patrick
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 10. August 2005, 14:33

Ach du wolltest Daten serialisieren? Ach so! Dann ist pickle tatsächlich besser!
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Re: binary data

Beitragvon BlackJack » Mittwoch 10. August 2005, 21:32

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: binary data

Beitragvon Leonidas » Mittwoch 10. August 2005, 21:50

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 Modvoice
patrickk

Beitragvon patrickk » Freitag 12. August 2005, 11:31

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 12. August 2005, 12:46

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 Modvoice
BlackJack

Beitragvon BlackJack » Sonntag 14. August 2005, 00:20

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

Beitragvon patrickk » Montag 15. August 2005, 08:12

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

Beitragvon BlackJack » Montag 15. August 2005, 23:27

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

Beitragvon patrickk » Dienstag 16. August 2005, 08:29

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...
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Dienstag 16. August 2005, 17:01

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

Beitragvon BlackJack » Dienstag 16. August 2005, 21:26

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder