2013-03-17 6 views
5

は動作します:`struct.unpack_from`は` bytearray`では動作しませんか?文字列から開梱

>>> import struct 
>>> struct.unpack('>h', 'ab') 
(24930,) 
>>> struct.unpack_from('>h', 'zabx', 1) 
(24930,) 

が、その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 

少し奇妙に思われます。私は実際にそれについて何をすべきですか?明らかに私は可能性:

>>> struct.unpack_from('>h', str(bytearray('zabx')), 1) 
(24930,) 

しかし、私は明示的に周りのメモリの可能性を大量にコピーする回避にしようとしています。

+0

バッファタイプを使用すると、より多くのメモリを占有することなく文字列を参照し、それを引数として渡すことができます。 –

答えて

6

buffer()がソリューションであるように見えます:

>>> struct.unpack_from('>h', buffer(bytearray('zabx')), 1) 
(24930,) 

buffer()元、そのビューのコピーではありません。

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

Alternitively、あなた(?I)だけの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,) 
>>> 
+0

'buffer( 'xaby'、index、length)'を使うのはなぜですか?それは余分なメモリも使いません。 –

+2

'struct'ビットが' bytearray'をラップしていることが起こりました。なぜなら、それは変更可能だからです。プライマリの変更可能なデータの読み取り専用ビューを維持するのではなく、むしろ中間のビットを再作成してプライマリソースからデータを取得したいと思います。これは '(24930、)'だけを保持するためにも使われます。私は本当にbytearrayから解き放つしたいですか? – SingleNegationElimination

+0

@ Asad:私は 'buffer'オブジェクトを作成することが、少なくとも少しのメモリを消費すると思う。 – martineau

関連する問題