Le module struct imite les structures C. Il faut plus de cycles CPU pour qu'un processeur lise un mot de 16 bits sur une adresse impaire ou un mot de 32 bits sur une adresse non divisible par 4, donc les structures ajoutent des octets de pad pour que les membres de la structure tombent sur des limites naturelles. Considérons:
struct { 11
char a;
short b; ------------
char c; axbbcxxxdddd
int d;
};
Cette structure occupera 12 octets de mémoire (x étant des octets de pad).
Python fonctionne de façon similaire (voir la documentation struct):
>>> import struct
>>> struct.pack('BHBL',1,2,3,4)
'\x01\x00\x02\x00\x03\x00\x00\x00\x04\x00\x00\x00'
>>> struct.calcsize('BHBL')
12
Compilateurs ont généralement un moyen d'éliminer le rembourrage. En Python, l'un des = <>! supprimera le remplissage:
>>> struct.calcsize('=BHBL')
8
>>> struct.pack('=BHBL',1,2,3,4)
'\x01\x02\x00\x03\x04\x00\x00\x00'
Méfiez-vous de laisser le rembourrage struct handle. En C, ces structures:
struct A { struct B {
short a; int a;
char b; char b;
}; };
sont typiquement 4 et 8 octets, respectivement. Le remplissage se produit à la fin de la structure dans le cas où les structures sont utilisées dans un tableau. Cela maintient les membres 'a' alignés sur les limites correctes pour les structures plus tard dans le tableau. Le module struct Python ne gonflez pas à la fin:
>>> struct.pack('LB',1,2)
'\x01\x00\x00\x00\x02'
>>> struct.pack('LBLB',1,2,3,4)
'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04'
Ce que je me demande, c'est pourquoi Python n'a pas emballé les données dans un tel format en premier lieu. "01 01 00" il a empaqueté l'octet 0x01, court 0x01, mais essaye de le déballer comme "01 00 01 00". Quoi qu'il en soit, j'ai résolu mon problème, j'ajoute toujours '<' devant tous mes codes de format, pour les rendre peu endiablés. Merci pour l'explication. :) –
avait un problème similaire, le '=' ni '@' n'a pas résolu ... en utilisant le code que j'ai fait sur mac sur windows – jokoon
@ThomasO Pourquoi dites-vous qu'il emballe comme "01 01 00"? Je vois struct.pack ('BH', 1, 2) == '\ x01 \ x00 \ x02 \ x00'. – aij