Salut,
Déjà, sizeof(char) est sans doute la seule valeur dont on peut être sûr au niveau des tailles des types primitifs: ca vaut 1 
tu pourrais donc déjà tout à fait simplifier les codes
char data[512-sizeof(char)-sizeof(char)];
en
et
char data[512-sizeof(char)-sizeof(short)];
en
char data[511-sizeof(short)];

Ceci étant dit:
Effectivement, dPkt utilise la même mémoire que _bytes, et donc a une taille de ... 512 octets.
Parmis ces 512 octets, il y en a 1 pour command, 1 (ou deux) pour len, et le reste pour data, ce qui est logique 
Par contre, il faut savoir que, len signifie "taille" en anglais et que, *typiquement", sur PC: - un type char permet de représenter 256 valeurs (de 0 à 255)
- un type short permet de représenter 65536 valeurs (de 0 à 65535)
Il en résulte que, dans U1, la taille maximale que len peut représenter (*typiquement* 255) est inférieure au nombre d'octet que peut prendre data (510), et que tu perd donc tout le bénéfice que tu peux trouver à travailler sur... 512 octets pour ta structure.
Avec U2, cependant, il n'y a plus ce problème:
len peut représenter 65536 valeurs, et est donc tout à fait capable de représenter toutes les tailles possibles pour data (qui ne fait "que" 509 octets, si l'on considère qu'un short = 2 char
)
La seule chose à laquelle faudra être attentif pour la cohérence des données, c'est que, en tout état de cause, len ne vaille jamais plus que... 509 (qui est le nombre maximal d'octets que peut contenir data) 
Enfin, si le but est de créer quelque chose qui soit le plus portable possible, les deux conseils à donner sont:
- De ne pas utiliser d'union
- d'utiliser de préférence les types dont la taille est clairement définie (uint8_t, uint16_t et autres similaires)

Partager