2017-11-08 1 views
0

Ich stehe vor einem seltsamen Problem. Ich kann die über eine Socket-Verbindung empfangenen Daten nicht dekodieren, während sie mit dem gleichen Code in Python 2.7 arbeiten. Ich weiß, dass der in Python 2 empfangene Datentyp ein String und ein Byte in Python 3 ist. Aber ich verstehe nicht, warum ich einen Fehler erhalte, wenn ich versuche zu dekodieren. Ich sende genau die gleichen Daten (Copy/Paste, um sicher zu sein), außer dass ich .encode() für Python 3 ausführen muss, um zu vermeiden, "TypeError, ein Byte-ähnliches Objekt wird benötigt, nicht 'str'"Python3-Socket kann Inhalt nicht decodieren

Python2:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.settimeout(15) 
s.connect((SERVERIP, SERVERPORT)) 
s.send(message) 
data = '' 
while True: 
    new_data = s.recv(4096) 
    if not new_data: 
     break 
    data += new_data 
    s.close() 

Python 3

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.settimeout(15) 
s.connect((SERVERIP, SERVERPORT)) 
s.send(message) 
data = '' 
while True: 
    new_data = s.recv(4096) 
    if not new_data: 
     break 
    data += new_data.decode('utf-8') #same result with new_data.decode() 
    s.close() 

Python 2 new_data Inhalt:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x05\xc1\xdd\[email protected]\x18\x00\xd0\x07r\xa3\xb6\xfdv]t\xa1T&\xb5d\x91\xd1tA\x98]F\xfeB\x1a\x0f\xdf9yu\x10s\xa3\xa29:\xdbl\xae\xe9\xe8\xd9H\xc8v\xa8\xd0K\x8c\xde\xd7\xef\xf9\xc4uf\xca\xfd \xdd\xb7\x0c\x9a\x84\xe9\xec\xb7\xf1\xf3\x97o\\k\xd5E\xc3\r\x11(\x9d{\xf7!\xdc*\x8c\xd5\x1c\x0b\xadG\xa5\x1e(\x97dO\x9b\x8f\x14\xaa\xddf\xd7I\x1e\xbb\xd4\xe7a\xe4\xe6a\x88\x8b\xf5\xa0\x08\xab\x11\xda\xea\xb8S\xf0\x98\x94\x1c\x9d\xa24>9\xbai\xd3\x1f\xe6\xcc`^\x91\xca\x02j\x1aLy\xccj\x0fdVn\[email protected]\xb0\[email protected]\x80hX#\xb0\x06\n\x0b\xc0\xf2x\xfe\x01?\x05\x1f\xc1\xc5\x00\x00\x00' 

Python3 new_data Inhalt:

b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x05\xc1\xdb\[email protected]\x00\x00\xd0\x0f\xf2\xc0\xda\xb5\xcbC\x0f"-\xb9gPM\x0f\x85&\x8b)\xb7\x1d\x1a\x1f\xdf9\xe3\xbc\xbe\xfd\x9e\xd9A\xe3:\x851,\xcf\xc4\xe5\x865|\xa5\xcb\xbb\xcbs\xa8\x8f\xcc\x1b\xf7\x06\xc5\x8f\xfa\xba\x84\xd8>\xea\xc0\xa5b\xe6\xceC\xea\xd0\x88\xebM\t\xd7\xf8\xc1*#hI\xd6F\x80\xb3B[\xa7\x99\x91\xbe\x16%Q\xf5\x1d(\xa0\x93\x87\n\x13\xbe\x92\x91\xcc\xbfT\x98b\xd3\x0b=\xc0\xd5\xb3\xdf}\xcc\xc9\xb1\xe4\'\xb1\xe25\xcc{tl\xe5\x92\xf34x\xd5\xa1\xf9K\xa4\xa8k\xa8 dU\xd7\x1e\xce\xb4\x02\xean\xc3\x10#\x05\x13L\x14\xa0(H\xd2d\xb8a\xbc\xdd\xee\x7f\x1b\xe5\xf1\xd2\xc5\x00\x00\x00' 

Und wenn so in python3 Ich erhalte diese Störung, wenn ich zu entschlüsseln versuchen:

'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte 

Die empfangenen Daten sind nicht das gleiche. Die Differenz beginnt nach 'x12B @'. Jemand hat eine Erklärung?

Ich verwalte die Serverseite nicht, also frag mich nicht, diese Seite zu überprüfen!

Danke,

Matthieu

+0

Ihre Daten sind nicht utf-8, so würde dieser Fehler auf Python erhalten 2 auch, wenn Sie versucht haben, es von utf-8 zu entschlüsseln. Warum versuchst du es überhaupt zu entschlüsseln, wenn es so aussieht, als wäre es Binärdaten, nicht Text? – Duncan

Antwort

1

Für Python 3 Sie mit Bytes arbeiten müssen, ist die Daten, die Sie haben keine Textzeichenfolge also nicht versuchen, es als eines zu interpretieren.

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.settimeout(15) 
s.connect((SERVERIP, SERVERPORT)) 
s.send(message) 
data = b'' 
while True: 
    new_data = s.recv(4096) 
    if not new_data: 
     break 
    data += new_data 
    s.close() 

Das alles, was Sie, die Daten zu empfangen benötigen sollte: Beginnen Sie mit einem leeren Bytes Objekt erstellt mit b'' oder nur bytes(), aber Sie müssen auch beachten Sie mit Bytes arbeiten, wenn Sie kommen das verarbeiten Daten, so dass Code wahrscheinlich auch geändert werden muss.

Sie nächster Schritt dieses bei der Verarbeitung ist wahrscheinlich:

import gzip 
text = gzip.decompress(data) 

und bei dieser Punkt kann es sinnvoll sein, das zu ändern: hier

text = gzip.decompress(data).decode('ascii') 

mit, was Codierung geeignet ist (die Beispieldaten, die Sie oben gepostet haben, enthalten nur ASCII, wenn dekomprimiert, so dass alles was Sie brauchen, oder Sie könnten UTF-8 oder eine andere Kodierung wollen, aber Sie müssen herausfinden, was verwendet wurde, um die Daten zu verschlüsseln, wie Sie nicht versuchen sollten raten). Allerdings sieht es aus wie es einige Rohr getrennte Felder enthält, so dass Sie die Felder erste und entschlüsseln oder auf andere Weise verarbeiten sie einzeln teilen möchten:

fields = gzip.decompress(b).split(b'|') 
+0

Einfach perfekt! Danke Duncan. Es funktioniert perfekt. – Matt

Verwandte Themen