2011-07-03 15 views
2

私は、次のPythonのコード例を実行すると、はPythonでソケットからバイナリデータを読み取る

tick = 0 
while True: 
    tick += 1 
    print tick 
    data = s.recv(1024) 
    if (tick == 1) and data: 
     print 'from client: %s' %(data) 
    elif (tick == 2) and data: 
     print 'from client: %s' %(data) 

私が見る、

1 
from client: client msg 
2 
from client: ? 
3 

私の直感はs.recvする私の第二の呼び出しを伝えます()実際にはいくつかのデータを返します。そして私は、クライアントが `? 'を送信していないことをかなり確信しています。キャラクター。

だから私は、 `データ」の最初のバイトを印刷することを望んでコードを変更

elif (tick == 2) and data: 
     print 'from client: %s' %(data) 
     print struct.unpack("!B", data) 

しかし、私は述べてトレースバックを取得:『struct.errorを:アンパック長さ1の文字列引数を必要とします』

structパッケージは、ソケットデータを処理する標準的な方法のようです。しかし、この状況は奇妙に見えます。私は印刷して視覚的にデータを受け取り、 "?"コードには条件に "and data"が含まれていますが、私は解凍できません。

ソケットからバイナリデータを処理する別の方法はありますか?

答えて

5
elif (tick == 2) and data: 
     print 'from client: %r' % data # (note 1) 
     print struct.unpack("!B", data[0]) # (note 2) 
  1. 印刷イグナシオのような表現が示唆されました。
  2. 1バイトをアンパックしたいので、struct.unpackを1バイトにします。
2

repr()を呼び出すか、%r書式指定指定子を使用して、オブジェクトの生の表現を表示できます。

+0

repr(data)の値は '\ xaa \ xae'です。私はこれから最初のバイトを解凍することはできませんか? – brooksbp

+0

はい、ただし2バイトです。 –

0

受信したデータが何を表しているかわからずに、受信したデータを解釈しようとしているようです。 ASCIIまたはUTF-8でエンコードされたユニコードまたはバイナリデータ(整数またはjpgまたはムービー)をソケット経由で送信できます。受信機能は送信されたものに合わせて調整する必要があります。

バイナリであることがわかっている場合は、バイトを送信していますか?それはunpack( "!B"、data [0])(TZによって示唆されているように)がすべてあなたを与えるからです。もしそうなら、私は答えが正しいと信じています。

len(data)を使用して受信量を把握できるようにする必要があります。部分的な読み取り(1025バイトの送信と1024の受信のみ)があるかどうかを確認する必要があります。

関連する問題