2009-08-17 7 views
9

Esta pregunta es básicamente la segunda mitad de mi otro Questionla conversión de un valor UINT16 en una matriz UINT8 [2]

¿Cómo puedo convertir un valor UINT16, en un UINT8 * matriz sin un bucle y evitar problemas endian.

Básicamente quiero hacer algo como esto:

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

El resultado final de esto es para almacenar valor en una matriz UINT8 evitando al mismo tiempo la conversión endian.

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

Cuando hago simplemente establecimiento de memoria con el valor UINT16, convierte a little-endian que arruina la salida. Estoy tratando de evitar el uso de las funciones de conversión endian, pero creo que tal vez no tenga suerte.

Respuesta

25

¿Qué tal

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

Esto debe entregar el mismo resultado independientemente del orden de bits.

O, si desea utilizar un inicializador de matriz:

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

(Sin embargo, esto sólo es posible si value es una constante.)

0

Un molde temporal para UINT16 * debe hacerlo:

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

Esto no funciona porque sigue siendo sensible a Endianness (básicamente, hace lo mismo que la 'memcpy' en la pregunta). –

7

No hay necesidad de compilación condicional. Puede cambiar de bit 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.

+2

la etiqueta de pregunta es C++, usa moldes de C++. –

4

Suponiendo que usted quiere tener la mayor orden byte por encima del byte de orden inferior en la matriz:

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

la máscara '0xff' es innecesaria: la conversión de enteros de 16 a 8 bits soltará el byte más alto (¡la conversión sin firmar está bien definida!) – Christoph

+2

Eso es cierto, pero generalmente enmascaré todo para mayor claridad. A veces, incluso hago un cambio de bit por 0 para que las líneas coincidan y se vean bien verticalmente. Cualquier buen compilador optimizará las declaraciones innecesarias, y vale la pena la claridad. – Jonathan

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

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

Esto es sensible a endianness. – Jonathan

0

I utiliza este hilo a dev Elop una solución que abarca las 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; 
} 
Cuestiones relacionadas