2013-04-12 6 views
7

私はいくつかのソケットIOを行い、バッファとしてbytearrayオブジェクトを使用しています。中間の文字列オブジェクトの作成を避けるために、以下に示すようにcsock.recv_intoを使用してこのバッファにオフセットを持つデータを受け取りたいとします。残念ながら、bytearはこのように使用できないようで、以下のコードは機能しません。bytearray with socket.recv_into

buf = bytearray(b" " * toread) 
read = 0 
while(toread): 
    nbytes = csock.recv_into(buf[read:],toread) 
    toread -= nbytes 
    read += nbytes 

ので、代わりに私がどのは、一時的な文字列(と作品)を使用しない、以下のコードを使用しています...

buf = bytearray(b" " * toread) 
read = 0 
while(toread): 
    tmp = csock.recv(toread) 
    nbytes = len(tmp) 
    buf[read:] = tmp 
    toread -= nbytes 
    read += nbytes 

は「doesnのこと、これを行うために、よりエレガントな方法があります中間の文字列をコピーする必要がありますか?

+0

あなたが取得しているエラーは何ですか?どのバージョンのPythonを(正確に)使用していますか? http://bugs.python.org/issue7827は、これがPython 2.7.2で修正されていることを示しています。 – nneonneo

+0

pythonのバージョンは2.7.3です。そして、これはそのバグに関連していません... csock.recv_into(buf)はうまく動作します。可能でないことは、次のように使用することです:csock.recv_into(buf [read:])それで、元のbufオブジェクトは更新されません。 – cyann

答えて

18

はあなたbytearrayをラップするmemoryviewを使用します。

buf = bytearray(toread) 
view = memoryview(buf) 
while toread: 
    nbytes = sock.recv_into(view, toread) 
    view = view[nbytes:] # slicing views is cheap 
    toread -= nbytes 
+0

パーフェクト!正確に私が探していたもの、ありがとう。メモリビューについて知りませんでした...今読んでください! – cyann