2011-11-25 17 views

Respuesta

12

Puede usar un memoryview para hacer el trabajo. Por ejemplo:

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

Suponiendo que iObject.readinto(...) lee los bytes 1, 2, 3, 4, y 5, entonces este código imprime:

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

También puede utilizar el objeto memoryview con struct.unpack_from y struct.pack_into. Por ejemplo:

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

impresiones de este código

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

Mi intención es leer directamente en el bytearray en un desplazamiento, y evitar toda la copia intermedia. –

+0

He editado mi respuesta para incluir un ejemplo usando la clase 'memoryview', que creo que hace lo que usted quiere. – srgerg

+0

Esta forma de vista de memoria parece lograr lo que yo quería. Si hiciera algo similar con struct.unpack_into, y usara una vista de memoria en lugar de una compensación, ¿sería lo mismo? Si este es el caso, elimine el resto de su respuesta para centrarse en esto. –

Cuestiones relacionadas