UDP Daten empfangen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Fileplayer
User
Beiträge: 8
Registriert: Dienstag 18. August 2015, 11:10

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')
Zuletzt geändert von Anonymous am Dienstag 18. August 2015, 11:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Welche Python Version? 3? Dann hier lesen: https://docs.python.org/3.3/reference/l ... s-literals
Fileplayer
User
Beiträge: 8
Registriert: Dienstag 18. August 2015, 11:10

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
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.
Fileplayer
User
Beiträge: 8
Registriert: Dienstag 18. August 2015, 11:10

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
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.
Fileplayer
User
Beiträge: 8
Registriert: Dienstag 18. August 2015, 11:10

Danke BlackJack,

nun klapt es !

Gruss Günni
Fileplayer
User
Beiträge: 8
Registriert: Dienstag 18. August 2015, 11:10

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
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Fileplayer hat geschrieben:test = str(data) # geht nicht
Dann mach eben: str(data, "utf-8")
Antworten