2009-11-14 10 views
9

En Python, j'accède à un fichier binaire en le lisant dans une chaîne puis en utilisant struct.unpack(...). Maintenant, je veux écrire à cette chaîne en utilisant struct.pack_into(...), mais j'obtiens l'erreur "Impossible d'utiliser la chaîne comme tampon modifiable". Quel serait un tampon approprié à utiliser avec le module struct?Qu'est-ce qu'un tampon approprié pour le module struct de Python

+0

Quelle version de python utilisez-vous? J'ai un peu joué avec des structures mais je n'ai jamais vu ça auparavant. – chrism1

+0

J'utilise Python 2.6.4 – mdm

Répondre

6

Si vous n'essayez pas de l'empaqueter dans un objet spécifique, utilisez simplement struct.pack pour renvoyer une chaîne.

Sinon, ctypes.create_string_buffer est un moyen d'obtenir un tampon mutable.

+0

Le tampon est la mémoire pour une machine virtuelle simple, j'ai donc besoin de pack dans un objet spécifique. La mémoire est petite mais la copie 128-512k pour un seul accès à la mémoire n'est pas une option. – mdm

6

Comme noté dans une autre réponse, struct_pack est probablement tout ce que vous devez utiliser. Cependant, les objets de type array prennent en charge le protocole de tampon et peuvent être modifiés:

>>> 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 ... 

Le protocole de tampon de départ était un peu d'une entaille principalement pour les extensions C. Il a été déprécié et remplacé par un new C-level buffer API and memoryview objects en Python 3 (et dans le prochain 2.7).

-1

Deux possibilités sautent immédiatement à l'esprit:

  • Vous pouvez utiliser le module Python stringio pour faire une lecture/écriture tampon avec la sémantique de fichier.

  • Vous pouvez utiliser le module Python array pour obtenir un tampon que vous pouvez traiter comme une liste, mais qui contiendra uniquement des octets binaires.