Question

Cette question est essentiellement la seconde moitié de mon autre Question

Comment puis-je convertir une valeur UInt16, en un tableau Uint8 * sans boucle et éviter les problèmes endian.

Fondamentalement, je veux faire quelque chose comme ça:

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

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

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

Lorsque je fais simplement MEMCPY avec la valeur UInt16, il se convertit en Little-Endan qui ruine la sortie. J'essaie d'éviter d'utiliser des fonctions de conversion endian, mais je pense que je ne pourrais que ne pas avoir de chance.

Était-ce utile?

La solution

Que diriez-vous

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

Cela devrait fournir le même résultat indépendant de l'endianité.

Ou, si vous souhaitez utiliser un initialiseur de tableau:

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

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

Autres conseils

Il n'y a pas besoin de compilation conditionnelle. Vous pouvez bit-shift 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 moulages sont facultatifs.

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

array[0] = value & 0xff;
array[1] = (value >> 8) & 0xff;
union TwoBytes
{
    UINT16 u16;
    UINT8 u8[2];
};

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

Un casting temporaire à uint16 * devrait le faire:

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

J'ai utilisé ce fil pour développer une solution qui s'étend sur des tableaux de nombreuses tailles:

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

int i;
for (i = 0; i < size; i++)
{
    array[i] = (value >> (8 * i)) & 0xff;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top