2016-07-01 5 views
1

Une bibliothèque QNX appelé gfpr.h contient la ligneComment fonctionne cette conversion endian?

#define ENDIAN_LE16(__x) (__x) 

qui est utilisé comme suit

var1 = ENDIAN_LE16(var1); 

pour convertir le endianness de (unsigned short) var1. Comment cela marche-t-il? __x et x__ doit avoir une signification particulière pour le préprocesseur?

Répondre

2

__x n'a pas de signification particulière. ENDIAN_LE16 est une macro qui fait un endroit pour changer l'endianness sans changer votre code source. Chaque cible de génération peut avoir une version différente de gfpr.h spécifique à cette cible.

Vous devez compiler pour une machine little-endian, donc ENDIAN_LE16 ne nécessite aucune modification. Il laisse simplement son argument (__x) inchangé. Si vous compiliez pour une cible big-endian, ENDIAN_LE16 serait défini pour échanger les octets de son argument. Quelque chose comme:

#define ENDIAN_LE16(__x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff)) 

De cette façon, en changeant le fichier cible gfpr.h vous inclure, vous obtenez les bons résultats sans avoir à changer votre code source.

Modifier Par la file you're probably looking at, ENDIAN_BE32 invoque ENDIAN_RET32, qui twiddles bits d'une manière similaire à ce que je l'ai montré ci-dessus.