l'emballage et le déballage de longueur variable array/string à l'aide de la struct module en python
Je suis en train d'essayer d'avoir une emprise autour de l'emballage et déballage de données binaires dans Python 3. Sa fait pas si difficile à comprendre, sauf un problème:
que faire si j'ai une longueur variable textstring et souhaitez emballer et déballer ce dans le plus élégant de la sorte?
Aussi loin que je peux dire d'après le manuel, je ne peux décompresser taille fixe directement des chaînes? Dans ce cas, il y a aucune manière élégante de contourner cette limitation, sans rembourrage, beaucoup, beaucoup de zéros inutiles?
Vous devez vous connecter pour publier un commentaire.
La
struct
module ne fait que du soutien de longueur fixe structures. Pour les chaînes de longueur variable, vos options sont:Construire dynamiquement votre chaîne de format (un
str
devra être converti à unbytes
avant de passer àpack()
):Sauter
struct
et juste normal d'utilisation de la chaîne de méthodes pour ajouter la chaîne à votrepack()
-ed de sortie:struct.pack("I", len(s)) + s
Pour le déballage, il vous suffit de décompresser un peu à la fois:
Si vous faites beaucoup de cela, vous pouvez toujours ajouter une fonction d'assistance qui utilise
calcsize
à faire la chaîne de découpage:str
àpack()
; ce qui a été adressée.s.rstrip(b'\x00').decode("utf_8")
.J'ai googlé cette question, et un couple de solutions.
construire
Un complexe, une solution flexible.
netstruct
Une solution rapide si vous avez seulement besoin d'un
struct
extension de longueur variable séquences d'octets. Imbrication d'une structure de longueur variable qui peut être réalisé parpack
ing la premièrepack
résultats.modifier: Ressemble à la longueur d'une chaîne de longueur variable utilise le même type de données que les éléments. Ainsi, la longueur maximale de chaîne de longueur variable d'octets 255, si les mots - 65535, et ainsi de suite.
netstruct
: "on dirait que ça n'utilise qu'un seul octet pour la longueur de la chaîne". Toutefois, le format de caractères avant de les$
signe indique le format à utiliser pour sa longueur. Vous avez choisib
, qui est un 1 octet entier. Si vous avez choisih
,netstruct
aurait utilisé un 2 octets entier pour représenter la longueur.Voici quelques fonctions wrapper j'ai écrit ce qui aide, ils semblent fonctionner.
Voici le déballage helper:
Voici l'emballage helper:
D'une manière facile que j'ai pu faire une longueur variable lors de l'emballage d'une chaîne de caractères est:
lors du déballage, c'est un peu de la même façon
À pack d'utilisation
Pour décompresser utilisation
Cela ne fonctionne que sur les chaînes utf-8 et assez simple solution de contournement.
Nice, mais ne peut pas gérer numérique nombre de domaines, tels que la " 6B "pour " BBBBBB'. La solution serait de développer la chaîne de format dans les deux fonctions avant de l'utiliser. Je suis venu avec cette:
Et même pour décompresser. Peut-être pas le plus élégant, mais il fonctionne 🙂