Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 将bytearray与socket.recv_一起使用到_Sockets_Python 2.7_Bytearray - Fatal编程技术网

Sockets 将bytearray与socket.recv_一起使用到

Sockets 将bytearray与socket.recv_一起使用到,sockets,python-2.7,bytearray,Sockets,Python 2.7,Bytearray,我正在做一些套接字IO,并使用bytearray对象作为缓冲区。为了避免创建中间字符串对象,我希望使用如下所示的csock.recv_into将带有偏移量的数据接收到此缓冲区。不幸的是,ByteArray似乎不能以这种方式使用,下面的代码也不起作用 buf = bytearray(b" " * toread) read = 0 while(toread): nbytes = csock.recv_into(buf[read:],toread) toread -= nbytes

我正在做一些套接字IO,并使用bytearray对象作为缓冲区。为了避免创建中间字符串对象,我希望使用如下所示的csock.recv_into将带有偏移量的数据接收到此缓冲区。不幸的是,ByteArray似乎不能以这种方式使用,下面的代码也不起作用

buf    = bytearray(b" " * toread)
read   = 0
while(toread):
  nbytes = csock.recv_into(buf[read:],toread)
  toread -= nbytes
  read   += nbytes
因此,我使用下面的代码,它确实使用了一个临时字符串(并且有效)


是否有一种更优雅的方法不需要复制中间字符串?

使用
memoryview
来包装
字节数组

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

您得到的错误是什么?您(确切地说)使用的是什么版本的Python?建议从Python2.7.2开始修复此问题。Python版本为2.7.3。这与那个bug无关。。。对我来说,恢复(buf)很好。不可能这样使用它:csock.recv_into(buf[read:]),因为原始的buf对象不会得到更新。太好了!正是我想要的,谢谢。不知道关于记忆的观点。。。现在就开始读吧!
buf = bytearray(toread)
view = memoryview(buf)
while toread:
    nbytes = sock.recv_into(view, toread)
    view = view[nbytes:] # slicing views is cheap
    toread -= nbytes