2013-07-13 3 views
4

J'essaie de comprendre la fonction de décompression en Python et comment elle utilise la chaîne de format. J'utilise la chaîne de format, "I" qui correspond à un entier non signé (taille, 4 octets) à titre d'exemple.décompresser la fonction en python

Conformément à la documentation, la fonction de décompression accepte une chaîne et la convertit en une liste de valeurs basée sur la chaîne de format.

http://docs.python.org/2/library/struct.html

Alors, je la valeur d'entrée comme une chaîne, « test » et voici le résultat:

>>> import struct 
>>> input="test" 
>>> l = struct.unpack("I", input)[0] 
>>> print l 
1953719668 

Je suis en train de comprendre comment la valeur de sortie a été dérivée de l'entrée .

>>> from struct import * 
>>> calcsize('I') 
4 

La taille de 'I' est de 4 octets. la chaîne "test" a 4 caractères, soit 4 octets. J'ai essayé de convertir chaque caractère en sa valeur hexadécimale hexadécimale correspondante et de l'enregistrer dans un ordre peu endian mais cela ne correspond pas à la sortie ci-dessus.

Toute aide serait appréciée.

Répondre

5

Utilisez 4s si vous souhaitez décompresser une chaîne telle quelle.

>>> struct.unpack('4s', 'test')[0] 
'test' 

1953719668 est dérivé par: (little endian)

>>> ord('t') + (ord('e') << 8) + (ord('s') << 16) + (ord('t') << 24) 
1953719668 
+0

Merci, je vérifiais un code qui utilisait "I" comme la chaîne de format pour la chaîne d'entrée. Pourriez-vous élaborer davantage sur la façon dont la chaîne de format est appliquée à l'entrée? Je pensais en petit boutiste que ce serait: ord (t), ord (s), ord (e), ord (t). octet le plus significatif à l'octet le moins significatif. Aussi, et si l'entrée a une taille supérieure à 4 octets (taille de unsigned int), elle n'appliquera pas de chaîne de format aux caractères restants? –

+0

@ NeonFlash, ord ('t') + (ord ('e') << 8) + (ord ('s') << 16) + (ord ('t') << 24) == (ord ('t') << 24) + (ord ('s') << 16) + (ord ('e') << 8) + ord ('t') – falsetru

+0

@NeonFlash, taille de la calcsize du format () et la longueur de la chaîne devrait être la même. Ou, il va augmenter 'struct.error'. – falsetru

Questions connexes