2013-03-17 10 views
5

von Strings Auspacken funktioniert:`struct.unpack_from` funktioniert nicht mit` bytearray`?

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

aber, wenn seine 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 

die ein wenig merkwürdig erscheint. Was soll ich eigentlich dagegen tun? offensichtlich konnte ich:

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

Aber ich versuche explizit vermeiden Kopieren möglicherweise große Mengen an Speicher um.

+0

Sie können den Puffertyp verwenden, um die Zeichenfolge zu verweisen, ohne mehr Speicher aufnehmen, dann ist das passiert als Argument. –

Antwort

6

Es ist wie buffer() aussieht, ist die Lösung:

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

buffer() ist keine Kopie des Originals, dessen Blick:

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

Alternitively, Sie (? I) kann nur Python verwenden 3; die Begrenzung wird aufgehoben:

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

Warum nicht einfach 'buffer ('xaby', index, length)' '? Das verbraucht auch keinen zusätzlichen Speicher. –

+2

passiert es, dass das 'struct'-Bit um ein' bytearray' gewickelt ist, das ausgewählt wurde * weil * es veränderbar ist. Jedes Mal, anstatt die schreibgeschützte Ansicht der primären, änderbaren Daten beizubehalten, würde ich eher die Bits in der Mitte neu erstellen, um die Daten von ihrer primären Quelle zu erhalten. Dies gilt auch für "(24930,)". Ich möchte wirklich aus einem 'Bytearray' auspacken. – SingleNegationElimination

+0

@Asad: Ich vermute, dass die Erstellung eines "Puffer" -Objekts zumindest wenig Speicher verbraucht. – martineau