2016-10-03 3 views
1

Gemäß der Python-Dokumentation gibt pythons socket recv() -Methode ein Array von 'Byte'-Typen zurück.Was genau kehrt soc.recv zurück?

Wenn Sie jedoch dieses Array aus, die Dinge, die wie Bytes sehen nicht auch erscheinen:

\xd9\x01\x01\xa4\xe9\xcbV6\x15\xed|>g5\xfa\xbd\xe9Q\[email protected]\x18\xff\ 

Hat das Python-Byte-Objekt einige interne Fehlerberichterstattung oder etwas? Was sind diese Byte-Objekte, die nicht als tatsächliche Bytes angezeigt werden?

Einige weitere ungerade Beispiele:

\x00w\xd4\x04;\x9c\x0b}>P]\xa4\xbd\xa5n:9x\xe3>9\xd2/~8\ 

\x01\x01\x1b ,Y\x00\x00\x00\x00\x00\xf4 

\xa0A\n\xd7tB}\xed,\xc0\x00\ 

Antwort

1

recv Dosis tatsächlich rohe Bytes zurück. Nur beim Drucken gehen Python-Bytes von einer ASCII-Codierung aus. Wenn der Wert in die ASCII-druckbaren Werte fällt, wird er als das ASCII-Zeichen gedruckt, das durch diesen 8-Bit-Wert dargestellt wird. Wenn kein ASCII-Ausdruck möglich ist, wird der Wert mit \x entfernt und das Hex gedruckt.

Beachten Sie, dass Sie, wenn Sie Python 3.5 verwenden, können Sie .hex auf die Bytes oben aufrufen und sehen, was die Hex-Werte sind. Dies sollte bestätigen, dass Sie die erwarteten Werte erhalten.

Fühlen Sie sich frei zu überprüfen, dass die Werte, die Sie senden, sind, was Sie erwarten, indem Sie Wireshark oder ähnliches verwenden, es ist nur in der Druckausgabe, die Sie sehen werden.

+0

Also das Byte-Objekt selbst (wie in, nicht zu drucken) wird richtige Werte haben, auch wenn sie nicht innerhalb der ASCII-Codierung sind, richtig? – user1519665

+0

Ja, wenn der Wert nicht ASCII-druckbar ist, erhalten Sie nur den Hexadezimalwert '\ x'. Wenn Sie sehen, was in Wireshark über den Draht geht, werden Sie sehen, dass die Werte genau das sind, was Sie erwarten. Dies ist lediglich ein Artefakt dafür, wie Python diese ausgibt. – shuttle87

+0

In Ordnung, vielen Dank. Hoffentlich funktioniert der Rest der Logik dann richtig! – user1519665