2009-11-14 10 views
9

En Python estoy accediendo a un archivo binario leyéndolo en una cadena y luego usando struct.unpack(...). Ahora quiero escribir en esa cadena usando struct.pack_into(...), pero obtengo el error "No se puede usar la cadena como buffer modificable". ¿Cuál sería un buffer adecuado para usar con el módulo struct?¿Qué es un tampón adecuado para el módulo struct de Python

+0

¿Qué versión de Python está usando? He jugado con las estructuras un poco, pero no lo había visto antes. – chrism1

+0

Estoy usando Python 2.6.4 – mdm

Respuesta

6

Si usted no está tratando de hacer las maletas en un objeto específico, sólo tiene que utilizar struct.pack para devolver una cadena.

De lo contrario, ctypes.create_string_buffer es una manera de obtener un tampón mutable.

+0

El búfer es la memoria de una máquina virtual simple, así que tengo que empacar en un objeto específico. La memoria es pequeña, pero copiar 128-512k para acceder a una sola memoria no es una opción. – mdm

6

Como se señaló en otra respuesta, struct_pack es probablemente todo lo que necesita y que debe utilizar. Sin embargo, los objetos de tipo array soportan el protocolo tampón y pueden ser modificados:

>>> import array, struct 
>>> a = array.array('c', ' ' * 1000) 
>>> c = 'a'; i = 1 
>>> struct.pack_into('ci', a, -0, c, i) 
>>> a 
array('c', 'a\x00\x00\x00\x01\x00\x00\x00 ... 

El protocolo búfer original era un poco de un corte principalmente para extensiones C. Ha quedado en desuso y reemplazado por un new C-level buffer API and memoryview objects en Python 3 (y en el próximo 2.7).

-1

dos posibilidades saltan inmediatamente a la mente:

  • Usted puede utilizar el módulo de Python stringio hacer una lectura/escritura de memoria intermedia con la semántica de archivos.

  • Puede utilizar el módulo Python array para obtener un búfer que puede tratar como una lista, pero que contendrá solo bytes binarios.

Cuestiones relacionadas