Pregunta

Esta pregunta es básicamente la segunda mitad a mi otra Pregunta

¿Cómo puedo convertir un valor UINT16, en una matriz uint8 * sin un bucle y evitar problemas de endian?

Básicamente quiero hacer algo como esto:

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

El resultado final de esto es almacenar el valor en una matriz UINT8 mientras evita la conversión de Endian.

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

Cuando simplemente hago memcpy con el valor UINT16, se convierte en un poco endian que arruina la salida. Estoy tratando de evitar usar funciones de conversión de Endian, pero creo que podría no tener suerte.

¿Fue útil?

Solución

Qué tal si

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

Esto debería ofrecer el mismo resultado independiente de la endianness.

O, si desea usar un inicializador de matriz:

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

(Sin embargo, esto solo es posible si value es una constante.)

Otros consejos

No hay necesidad de compilación condicional. Puede cambiar de bits para obtener el byte más alto y más bajo del valor:

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 }

Los moldes son opcionales.

Suponiendo que desea tener el byte de alto orden por encima del byte de orden inferior en la matriz:

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 elenco temporal a Uint16* debería hacerlo:

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

Utilicé este hilo para desarrollar una solución que abarque matrices de muchos tamaños:

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

int i;
for (i = 0; i < size; i++)
{
    array[i] = (value >> (8 * i)) & 0xff;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top