14

私はPythonとネットワーキングを探し回っています。

while True:
   data = sock.recv(10240)

これは間違いなく聞いています。ただし、テキスト文字列に変換する必要があるようです。

struct.unpack()を使用している人を見たことがありますが、それがどのように機能するのか正確にはわかりません。変換する方法は何ですか?

4

2 に答える 2

29

返されるrecvのはbytes文字列です。

ソケットからデータを受信します。戻り値は、受信したデータを表すバイトオブジェクトです。

Python 3.xでは、bytes文字列をUnicodeテキスト文字列に変換するstrには、文字列がエンコードされている文字セットを知っている必要があるため、を呼び出すことができますdecode。たとえば、UTF-8の場合:

stringdata = data.decode('utf-8')

(Python 2.xでは、bytesと同じstrであるため、すでに文字列があります。ただし、Unicodeテキスト文字列を取得する場合はunicode 3.xと同じです。)

人々がよく使用する理由structは、データが8ビットまたはUnicodeテキストだけでなく、他の形式であるためです。たとえば、各メッセージを「ネット文字列」として送信できます。長さ(ASCII数字の文字列)、:区切り文字、lengthUTF-8のバイト、 .,などのaの順になりb"3:Abc,"ます。(フォーマットにはバリエーションがありますが、これはBernsteinの標準ネットストリングです。)

人々がネットストリングまたは他の同様の技術を使用する理由は、TCPを使用しているときにメッセージを区切るための何らかの方法が必要だからです。それぞれrecvが、反対側が通過したものの半分を与えるかsend、3send秒と4番目の一部を与える可能性があります。したがって、データのバッファを蓄積してから、recvそこからメッセージを引き出す必要があります。そして、あるメッセージがいつ終了し、次のメッセージがいつ始まるかを知るための何らかの方法が必要です。改行なしでプレーンテキストメッセージを送信するだけの場合は、改行を区切り文字として使用できます。それ以外の場合は、他の何かを考え出す必要があります。たとえば、ネットストリング、\0区切り文字としての使用、改行を区切り文字として使用するがデータ内の実際の改行のエスケープ、JSONなどの自己区切りの構造化形式の使用などです。

于 2012-12-20T20:18:47.537 に答える
5

Python 2.7.x以前では、dataはすでに文字列です。Python 3.xでは、dataはバイトオブジェクトです。バイトを文字列に変換するには、decode()メソッドを使用します。 decode()'utf-8'のようなコーデック引数が必要になります。

于 2012-12-20T20:18:29.113 に答える