2017-11-08 3 views
0

私は奇妙な問題に直面しています。私は、Python 2.7の同じコードで動作している間に、ソケット接続を通じて受け取ったデータをデコードできません。私は、Python 2で受け取ったデータ型がPython 3の文字列であることを知っています。しかし、私が解読しようとするとエラーが発生する理由を理解できません。 Python 3が "TypeError"を受け取らないようにするために.encode()を実行する必要があることを除いて、まったく同じデータ(コピー/貼り付け)を送信しています。Python3ソケットはコンテンツをデコードできません

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() 

パイソン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() 

パイソン2 NEW_DATA含量

'\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内容:

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' 

そして私は解読しようとしたときのpython3で、私はこのエラーを受けています:

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

受信したデータは同じではありません。違いは 'x12B @'の後に始まります。誰か説明がありますか?

私はサーバー側を管理していないので、この側を確認するように私に依頼しないでください!

おかげで、

マチュー

+0

あなたのデータはUTF-8ではありませんので、あなたは、Pythonでこのエラーになるだろうあなたがutf-8からそれを解読しようとした場合も同様です。テキストではないバイナリデータのように見えるとき、なぜそれをすべてデコードしようとしていますか? – Duncan

答えて

1

は、Python 3のためにあなたがバイトで作業する必要がある、あなたが持っているデータは、そうしようとする一人としてそれを解釈していないテキスト文字列ではありません。あなたがデータを受信するために必要なすべてをする必要があります

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() 

は:b''またはちょうどbytes()を使用して作成されたオブジェクトの空のバイトで始まっていますが、処理に来るとき、あなたはまた、あなたがバイトで作業している認識する必要がありますデータを変更する必要があります。 (ここでは適切であるものは何でもエンコーディング使用

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

import gzip 
text = gzip.decompress(data) 

この時点でにそれを変更することが適切かもしれ:

あなたはこれを処理するための次のステップは、おそらくです上記のサンプルデータには、圧縮解除時にasciiが含まれていますので、必要な部分のみが表示されます。utf-8などのエンコーディングが必要な場合もありますが、試してはいけないデータのエンコードに使用された推測する)。あなたが最初のフィールドを分割してデコードするか、そうでない場合は、個別にそれらを処理する場合がありますので、それはいくつかのパイプで区切られたフィールドが含まれているようしかし、それが見えます:

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

ちょうど完璧!おかげでダンカン。それは完全に動作します。 – Matt

関連する問題