使用字节组与socket.recv_into(using bytearray with socket

2019-08-22 04:00发布

我做了一些插座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

所以不是我使用下面的代码,它使用临时字符串(和作品)...

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

有没有更优雅的方式来做到这一点并不需要大约抄袭中间串?

Answer 1:

使用memoryview来包装你bytearray

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


文章来源: using bytearray with socket.recv_into