Seite 1 von 1
UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 11:32
von Fileplayer
Hallo, ich bin neu hier und versuche gerade ein Problem zu lösen ( wie folgt) :
Ich empfange auf dem Raspi per Socket einen UDP Data. Die Daten werden auch empfangen. Es sind nur 2 Byte. Gesendet (vom anderen Rechner wird "on". Die länge des des Strings oder der Byte-Strings ist auch 2 >> print len(Data) . Wenn ich aber den String printen erfolgt als Ausgabe ==> b'on' (?!). Auch ein vergleich wie zb. if data =="on" schlägt immer fehl. Wie bekomme ich das in einen normalen String ?
Oder was mache ich falsch ??
Bin echt am verzweifeln. Bitte kann mir jemald Helfen . Danke
Gruss Günni
PS.: hier ausschnitt des Programmes
Code: Alles auswählen
sock = socket.socket(socket.AF_INET,socket.SOCKDGRAM)
sock.bind(('',22222))
while True:
data,addr = sock.recvfrom(512)
if data == "on":
print ('on emfangen')
else
print ('was anderes')
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 11:45
von sparrow
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 13:08
von Fileplayer
SORRY ist Python 3
Ja, Danke für die Antwort, aber...
hab ich nicht verstanden
also, in data ist das drin was gesendet wurde. Wenn es aber geprintet wurde steht da ==> b'on' , es werden dann 5 Zeichen geprinted. Der Vergleich geht auch nicht, obwohl das richtige in data ist. Kann man denn nicht das was in data ist in einen normalen String kopieren ?
Danke dir für die Antwort
Gruss Günni
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 13:41
von BlackJack
@Fileplayer: Das ist die Zeichenkettendarstellung eines `bytes`-Objekts das die beiden Bytes mit den Dezimalwerten 111 und 110 enthält, was als ASCII-Zeichen den Zeichen 'o' und 'n' entspricht. Die Zeichen b' und das abschliessende ' gehören nicht zum Inhalt sondern kennzeichnen und begrenzen die literale Darstellung des `bytes`-Objekts. Du musst entweder die Bytes in eine Zeichenkette umwandeln (dekodieren) oder im Programm mit einem `bytes`-Objekt vergleichen. Wie man das schreibst, siehst Du ja an der Ausgabe die Du bekommst. Vielleicht hilft auch dieser Teil der Dokumentation etwas weiter:
https://docs.python.org/3.3/library/std ... memoryview
Der Unterschied zwischen Bytes/Byteketten und Zeichen/Zeichenketten ist wichtig. Den sollte man verstanden haben, weil einem das an den Grenzen/Schnittstellen seiner Programme immer wieder begegnen wird.
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 14:20
von Fileplayer
Danke Blackjack !!
Ja, das ist jetzt klar, ich versuche mich jetzt mal an die Umsetzung in einen normalen String.
(Ich verstehe nur nicht wie die anderen Sprachen fast alle ohne den Typ Byte-String klarkommen, aber wenn ich denn jemals Fortgeschrittener bin, verstehe ich auch das

)
Also Danke BlackJack
Gruss Günni
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 14:36
von BlackJack
@Fileplayer: Welche anderen Sprachen? Es gibt sowohl welche die nur Bytestrings haben, besonders die älteren, und welche die nur Unicode-Zeichenketten haben. Bei den ersteren kümmert man sich entweder gar nicht um die Kodierung der Bytes und hofft einfach das alle Daten schon in der gleichen Kodierung vorliegen und alles gut geht, oder man muss extra Bibliotheken installieren und sich ums umkodieren kümmern. Bei Netztwerkprotokollen beschränkt man sich ja auch oft auf ASCII, was dann kaum Probleme macht was die Kodierung angeht, weil ASCII eine Untermenge von den meisten Kodierungen ist, die heute so gebräuchlich sind. Sozusagen der kleinste gemeinsame Nenner. Bei den Sprachen die nur Unicode-Zeichenketten haben, da muss man die Kodierung entweder an den Schittstellen nach aussen irgendwo angeben, oder die Laufzeitumgebung der Sprache ”rät” welche Kodierung wohl die richtige sein mag.
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 14:39
von Fileplayer
Danke BlackJack,
nun klapt es !
Gruss Günni
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 16:49
von Fileplayer
Hallo BlackJack,
Also, ich kenne die nicht, aber ich kenne Arrays vom Typ Byte. Da kann ich dann auf jedes Element zugreifen, kann man bei Python auch, aber ich habe es nicht geschafft dieses Byte-String in ein String umzuwandeln. Beim vergleich habe ich vorher hier bei Python ein Var gemacht der als Inhalt hatte:
Test = b'on'
Geht also so auch.
PS: ich weis bis jetzt nicht wie ich den Byte-string in String wandeln kann, mit str ?
test = str(data) # geht nicht
ist aber auch egal.
Und was sind die TAGs für Programmcode einfügen ?
Gruss Günni
Re: UDP Daten empfangen
Verfasst: Dienstag 18. August 2015, 16:58
von sparrow
1. Tags:
bzw. auf den Button "Code" drücken, wenn du einen Beitrag schreibst.
2.
Code: Alles auswählen
>>> a = b"hallo"
>>> b = "hallo"
>>> a == b
False
>>> c = a.decode()
>>> b == c
True
Re: UDP Daten empfangen
Verfasst: Donnerstag 10. September 2015, 16:11
von Alfons Mittelmeyer
Fileplayer hat geschrieben:test = str(data) # geht nicht
Dann mach eben: str(data, "utf-8")