Python: Comment emballer les différents types de données dans une mémoire tampon de chaîne à l'aide struct.pack_into
Je suis en train d'emballer des unsigned int données dans une mémoire tampon de chaîne créée à l'aide de ctypes.create_string_buffer
.
Ici est le segment de code suivant, et l'exécution d'un exemple montrant l'erreur sur codepad:
import struct
import ctypes
import binascii
buf = ctypes.create_string_buffer(16)
struct.pack_into("=I=I=I", buf, 0, 1, 2, 3)
print binascii.hexlify(buf)
Cela donne l'erreur suivante:
...
struct.error: bad char in struct format
La documentation n'est pas une allusion à savoir si vous pouvez emballer les données de types différents si le sous-jacent de la mémoire tampon est spécifique de type C. Dans ce cas, en essayant de pack unsigned int données dans une mémoire tampon de chaîne avec un sous-jacent c_char type. Quelqu'un connais une solution pour ce faire, ou est-il une façon particulière de créer une mémoire tampon qui peut emballer n'importe quel type de données?
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas censé pour chaque préfixe de sortie spécificateur avec le '=' code. Juste dire une fois:
Cela donne:
Désolé pour ressusciter les vieux sujet, mais je reçois le point de "snap" d'être touché par les probablement similaire fond habitude.
"le premier caractère de la chaîne de format peut être utilisé pour indiquer l'ordre des octets, la taille et l'alignement des paniers de données" je suis d'accord. Cependant:
III
" se compose de trois chaînes de format, et nous pouvons le format de chacun d'entre eux à volonté. Donc=I=I=I
. Je me suis tourné dans le pied après s'être habitué à Ruby de tableau.pack, où l'on peut librement modifier la commande, le long de l'expression (Ruby, l'équivalent de l'estI_I_I_
dans ce cas, la commande sélecteur vient après).Donc je suppose que c'est peut-être bon d'ajouter quelques lignes de structure.pack/unpack docs, en donnant des exemples de la commande & padding utilisation (meh, rembourrage m'a frappé encore plus fort... je pourrais vivre avec ordre d'origine, mais rembourrage ruiné mon protocole).
Procédure d'exploitation Standard: Lire le message d'erreur.
"mauvais char, struct format" signifie ce qu'il dit.
Procédure d'exploitation Standard: Vérifier les docs. Ici il est dit "le première [je souligne] caractère de la chaîne de format peut être utilisé pour indiquer l'ordre des octets, la taille et l'alignement des paniers de données" et va sur la liste
=
comme une possibilité. La section suivante (en forme des Caractères) répertorie un grand nombre de lettres y comprisI
.Conclusion: votre chaîne de format doit être
"=III"
.Remarque: Le problème n'a rien à voir avec le tampon de destination à tous, et encore moins de ses sous-jacent de type C: