2011-11-25 9 views

risposta

12

È possibile utilizzare un memoryview per eseguire il lavoro. Per esempio:

dest = bytearray(10) # all zero bytes 
v = memoryview(dest) 
ioObject.readinto(v[3:]) 
print(repr(dest)) 

Supponendo che iObject.readinto(...) legge il byte 1, 2, 3, 4, e 5 quindi questa stampe di codice:

bytearray(b'\x00\x00\x00\x01\x02\x03\x04\x05\x00\x00') 

È inoltre possibile utilizzare l'oggetto memoryview con struct.unpack_from e struct.pack_into. Per esempio:

dest = bytearray(10) # all zero bytes 
v = memoryview(dest) 
struct.pack_into("2c", v[3:5], 0, b'\x07', b'\x08') 
print(repr(dest)) 

stampe questo codice

bytearray(b'\x00\x00\x00\x07\x08\x00\x00\x00\x00\x00') 
+0

La mia intenzione è quella di leggere direttamente nel ByteArray a un offset, e di evitare tutte le copie intermedio. –

+0

Ho modificato la mia risposta per includere un esempio usando la classe 'memoryview', che credo faccia ciò che si desidera. – srgerg

+0

Questa forma di visualizzazione della memoria sembra realizzare ciò che volevo. Se facessi una cosa simile con struct.unpack_into, e usassi un memoryview invece di un offset, sarebbe lo stesso? In questo caso, rimuovere il resto della risposta per concentrarsi su questo. –