a
est un pointeur vers un tableau d'octets. Si vous le transformez en uint16_t et l'affectez à b
, alors b
contiendra l'adresse de la base du tableau (où il est stocké) dans SRAM. Si vous souhaitez traiter les deux octets du tableau a
comme un entier, utilisez une union comme suggéré par user14284, mais sachez que l'union représentera le tableau d'octets dans l'ordre des octets de la mémoire de l'architecture (dans AVR, ce serait peu -endian, ce qui signifie que l'octet 0 est l'octet le moins significatif). La façon d'écrire cela dans le code est:
union{
uint8_t a[2];
uint16_t b;
} x;
x.b[0] = 0x35;
x.b[1] = 0x4A;
// by virtue of the above two assignments
x.a == 0x4A35 // is true
Une autre façon de le faire sans utiliser l'union est de a
transtyper en un pointeur uint16_t puis de le déréférencer comme ceci:
uint8_t a[2] = {0x35, 0x4A};
uint16_t b = *((uint16_t *) a);
b == 0x4A35; // because AVR is little endian
Si vous utilisez le tampon pour stocker de grandes données endiennes (par exemple, l'ordre des octets du réseau), vous devrez alors permuter les octets pour utiliser l'une de ces techniques. Un moyen de le faire sans aucune branche ni variable temporaire est:
uint8_t a[2] = {0x35, 0x4A};
a[0] ^= a[1];
a[1] ^= a[0];
a[0] ^= a[1];
a[0] == 0x4A; // true
a[1] == 0x35; // true
Soit dit en passant, ce n'est pas un AVR ou même un problème intégré uniquement. Niveau d'application code réseau sur des PC appels généralement appelés fonctions htonl
, htons
(hôte réseau, et 16 32- bits variantes) et ntohl
, ntohs
(réseau hôte, et les variantes 32- 16 bits) dont la mise en oeuvre sont l' architecture cible dépend de savoir si elles permutez ou non les octets (en supposant que les octets tels qu'ils sont transmis «sur le câble» sont toujours en gros bout quand ils font partie de mots à plusieurs octets).