2013-01-14 4 views
0

J'essaie d'utiliser la fonction pack du module struct pour coder les données dans les formats requis par un protocole réseau. J'ai rencontré un problème en ce sens que je ne vois aucun moyen d'encoder des tableaux de tout autre chose que des caractères de 8 bits.Utilisation du pack python avec des tableaux

Par exemple, pour coder "TEST", je peux utiliser le spécificateur de format "4s". Mais comment puis-je encoder un tableau ou une liste d'entiers 32 bits ou d'autres types non-chaîne?

Voici un exemple concret. Supposons que j'ai une fonction doEncode qui prend un tableau de valeurs de 32 bits. Le protocole nécessite un champ de longueur de 32 bits, suivi par le tableau lui-même. Voici ce que j'ai pu trouver jusqu'à présent.

from array import * 
from struct import * 

def doEncode(arr): 
    bin=pack('>i'+len(arr)*'I',len(arr), ???) 

arr=array('I',[1,2,3]) 
doEncode(arr) 

Le meilleur que j'ai pu trouver est la génération d'un format à la chaîne pack dynamique de la longueur du tableau. Y at-il un moyen de spécifier que j'ai un tableau, donc je n'ai pas besoin de faire cela, comme il y a avec une chaîne (qui serait par exemple pack('>i'+len(arr)+'s')? Même avec l'approche ci-dessus, je ne suis pas sûr de la façon dont je passerais effectivement les éléments dans le tableau d'une manière dynamique similaire, à savoir je ne peux pas dire , arr[0], arr[1], ... parce que je ne sais pas à l'avance quelle sera la longueur. Je suppose que je pourrais simplement emballer chaque entier individuel dans le tableau dans une boucle, puis joindre tous les résultats ensemble, mais cela semble être un hack. Y a-t-il une meilleure façon de faire cela? Les modules array et struct semblent chacun faire leur propre chose, mais dans ce cas, ce que j'essaie de faire est une combinaison des deux, ce qui ne veut pas faire.

Répondre

1
data = pack('>i', len(arr)) + arr.tostring() 
+0

Ah, merci. Devrais-je m'inquiéter de la partie 'len (arr) * '' 'pour les grandes valeurs de len (arr)? – Michael

Questions connexes