`struct.unpack_from`不适用于`bytearray`?

Sin*_*ion 5 python binary-data

从字符串解包工作:

>>> import struct
>>> struct.unpack('>h', 'ab')
(24930,)
>>> struct.unpack_from('>h', 'zabx', 1)
(24930,)
Run Code Online (Sandbox Code Playgroud)

但如果它是bytearray:

>>> struct.unpack_from('>h', bytearray('zabx'), 1)
Traceback (most recent call last):
  File "<ipython-input-4-d58338aafb82>", line 1, in <module>
    struct.unpack_from('>h', bytearray('zabx'), 1)
TypeError: unpack_from() argument 1 must be string or read-only buffer, not bytearray
Run Code Online (Sandbox Code Playgroud)

这似乎有点奇怪.我该怎么办呢?显然我可以:

>>> struct.unpack_from('>h', str(bytearray('zabx')), 1)
(24930,)
Run Code Online (Sandbox Code Playgroud)

但我明确地试图避免复制可能的大量内存.

Sin*_*ion 6

它看起来像是buffer()解决方案:

>>> struct.unpack_from('>h', buffer(bytearray('zabx')), 1)
(24930,)
Run Code Online (Sandbox Code Playgroud)

buffer() 不是原件的副本,它的观点是:

>>> b0 = bytearray('xaby')
>>> b1 = buffer(b0)
>>> b1
<read-only buffer for ...>
>>> b1[1:3]
'ab'
>>> b0[1:3] = 'nu'
>>> b1[1:3]
'nu'
Run Code Online (Sandbox Code Playgroud)

另外,你(我?)可以使用python 3; 解除限制:

Python 3.2.3 (default, Jun  8 2012, 05:36:09) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import struct
>>> struct.unpack_from('>h', b'xaby', 1)
(24930,)
>>> struct.unpack_from('>h', bytearray(b'xaby'), 1)
(24930,)
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 碰巧`struct`位绕着`bytearray`,选择*因为*它是可变的.每次而不是维护主要可变数据的只读视图,我宁愿只是重新创建中间的位以从其主要源获取数据.这也只是为了保持`(24930,)`.我真的想从`bytearray`解压缩. (2认同)