使用带有 socket.recv_into 的 bytearray

Posted

技术标签:

【中文标题】使用带有 socket.recv_into 的 bytearray【英文标题】:using bytearray with socket.recv_into 【发布时间】:2013-04-04 10:26:55 【问题描述】:

我正在做一些套接字 IO,并使用 bytearray 对象作为缓冲区。我想使用 csock.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

有没有更优雅的方法来做到这一点,不需要复制中间字符串?

【问题讨论】:

您遇到的错误是什么?您使用的是什么版本的 Python(确切地说)? bugs.python.org/issue7827 建议这是从 Python 2.7.2 开始修复的。 python 版本为 2.7.3。这与那个错误无关...... csock.recv_into(buf) 对我来说很好。不可能像这样使用它: csock.recv_into(buf[read:]) 因为原始的 buf 对象不会得到更新。 【参考方案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

【讨论】:

完美!正是我想要的,谢谢。不知道内存视图...现在阅读它们!

以上是关于使用带有 socket.recv_into 的 bytearray的主要内容,如果未能解决你的问题,请参考以下文章

使用 ORM,我可以将带有 a、b、c 列的 DB 表映射到带有带有键 a、b、c 的 Map 的类吗?

使用带有 \b 的正则表达式来匹配字符串中的不同短语[重复]

带有 nojvm 或优化标志的 mcc -B 选项

np.genfromtxt 返回带有 'b' 的字符串 [重复]

带有\b和国际字符的Javascript正则表达式问题

在 Rust 中使用带有结构的生命周期的正确方法是啥?