2009-08-17 5 views
9

Cette question est essentiellement la deuxième moitié de mon autre QuestionLa conversion d'une valeur UINT16 dans un tableau de UINT8 [2]

Comment puis-je convertir une valeur UINT16, dans un UINT8 * tableau sans une boucle et d'éviter les problèmes endian.

Fondamentalement, je veux faire quelque chose comme ceci:

UINT16 value = 0xAAFF; 
UINT8 array[2] = value; 

Le résultat final de c'est de stocker la valeur dans un tableau de UINT8 tout en évitant la conversion endian.

UINT8 * mArray; 
memcpy(&mArray[someOffset],&array,2); 

Quand je fais simplement memcpy avec la valeur UINT16, il convertit à petit-boutiste qui ruine la sortie. J'essaie d'éviter d'utiliser les fonctions de conversion endian, mais pense que je peux juste être hors de la chance.

Répondre

25

Que diriez-vous

UINT16 value = 0xAAFF; 
UINT8 array[2]; 
array[0]=value & 0xff; 
array[1]=(value >> 8); 

Cela devrait offrir le même résultat indépendant de boutisme.

Ou, si vous souhaitez utiliser un initialiseur de tableau:

UINT8 array[2]={ value & 0xff, value >> 8 }; 

(Cependant, cela est possible que si value est une constante.)

0

Un casting temporaire UINT16 * devrait le faire:

((UINT16*)array)[0] = value; 
+1

Cela ne fonctionne pas parce qu'il est toujours sensible à boutisme (essentiellement, il fait la même chose que le 'memcpy' dans la question). –

7

Il n'y a pas besoin de compilation conditionnelle. Vous pouvez changer de bit pour obtenir l'octet supérieur et inférieur de la valeur:

uint16_t value = 0xAAFF; 
uint8_t hi_lo[] = { (uint8_t)(value >> 8), (uint8_t)value }; // { 0xAA, 0xFF } 
uint8_t lo_hi[] = { (uint8_t)value, (uint8_t)(value >> 8) }; // { 0xFF, 0xAA } 

Les modèles sont optionnels.

+2

le point d'interrogation est C++, utilisez C++ cast. –

4

En supposant que vous voulez avoir le haut ordre octet au-dessus de l'octet d'ordre inférieur dans le tableau:

array[0] = value & 0xff; 
array[1] = (value >> 8) & 0xff; 
+2

le masque '0xff' est inutile: la conversion de 16 à 8 bits entiers laissera tomber l'octet supérieur (la conversion non signée est bien définie!) – Christoph

+2

C'est vrai, mais je masque généralement tout pour plus de clarté. Parfois, je vais même faire un petit décalage de 0 pour que les lignes s'accordent toutes et soient bien verticales. Tout bon compilateur optimisera les déclarations inutiles, et cela en vaut la peine. – Jonathan

1
union TwoBytes 
{ 
    UINT16 u16; 
    UINT8 u8[2]; 
}; 

TwoBytes Converter; 
Converter.u16 = 65535; 
UINT8 *array = Converter.u8; 
+1

Ceci est sensible à l'endianness. – Jonathan

0

I utilisé à ce fil dev ELOP une solution qui couvre des tableaux de plusieurs tailles:

UINT32 value = 0xAAFF1188; 
int size = 4; 
UINT8 array[size]; 

int i; 
for (i = 0; i < size; i++) 
{ 
    array[i] = (value >> (8 * i)) & 0xff; 
} 
Questions connexes