Vous utilisez probablement un ordinateur qui utilise une représentation "little-endian" des nombres dans la mémoire (telle que l'architecture Intel x86). Fondamentalement, cela signifie que le octet le moins significatif de toute valeur sera stocké à l'adresse la plus basse de l'emplacement de mémoire qui est utilisé pour stocker les valeurs. See Wikipdia for details.
Dans votre cas, le nombre 0xAAFF est constitué des deux octets 0xAA et 0xFF avec 0xFF étant le moins significatif. Par conséquent, une machine little-endian stockera 0xFF à l'adresse la plus basse, puis 0xAA. Par conséquent, si vous interprétez l'emplacement mémoire dans lequel vous avez écrit une valeur UINT16 comme UINT8, vous obtiendrez l'octet écrit à cet emplacement qui se trouve être 0xFF
Si vous souhaitez écrire un tableau de valeurs UINT16 dans un de façon appropriée tableau des valeurs de taille uint8 telle que la sortie correspondra à vos attentes que vous pourriez le faire de la manière suivante:
/* copy inItems UINT16 values from inArray to outArray in
* MSB first (big-endian) order
*/
void copyBigEndianArray(UINT16 *inArray, size_t inItems, UINT8 *outArray)
{
for (int i = 0; i < inItems; i++)
{
// shift one byte right: AAFF -> 00AA
outArray[2*i] = inArray[i] >> 8;
// cut off left byte in conversion: AAFF -> FF
outArray[2*i + 1] = inArray[i]
}
}
vous pouvez également consulter la hton*/ntoh*-family of functions si elles sont disponibles sur votre plate-forme.
L'une des deux réponses existantes que je publie ceci est faux ..... –