a
es un puntero a una matriz de bytes. Si lo convierte a uint16_t y se lo asigna b
, b
contendrá la dirección de la base de la matriz (donde está almacenada) en SRAM. Si desea tratar los dos bytes de la matriz a
como un número entero, use una unión como lo sugiere el usuario 14284, pero tenga en cuenta que la unión representará la matriz de bytes en la ordenación de bytes de memoria de la arquitectura (en AVR eso sería poco -endian, que significa que el byte 0 es el byte menos significativo). La forma de escribir eso en código es:
union{
uint8_t a[2];
uint16_t b;
} x;
x.b[0] = 0x35;
x.b[1] = 0x4A;
// by virtue of the above two assignments
x.a == 0x4A35 // is true
Otra forma de hacer esto sin usar una unión es lanzar a
a un puntero uint16_t y luego desreferenciarlo así:
uint8_t a[2] = {0x35, 0x4A};
uint16_t b = *((uint16_t *) a);
b == 0x4A35; // because AVR is little endian
Si está utilizando el búfer para almacenar datos de Big Endian (por ejemplo, el orden de bytes de la red), entonces deberá intercambiar bytes para utilizar cualquiera de estas técnicas. Una forma de hacerlo sin ramificaciones o variables temporales es:
uint8_t a[2] = {0x35, 0x4A};
a[0] ^= a[1];
a[1] ^= a[0];
a[0] ^= a[1];
a[0] == 0x4A; // true
a[1] == 0x35; // true
Por cierto, este no es un AVR o incluso un problema solo incrustado. Nivel de aplicación de red de código escrito para PC normalmente llamadas de llamadas funciones htonl
, htons
(sede de la red, de 32 y 16 bits variantes) y ntohl
, ntohs
(red de acogida, de 32 y 16 bits variantes), cuyo objetivo son las implementaciones de la arquitectura depende de si se intercambie los bytes o no (bajo el supuesto de que los bytes transmitidos 'en el cable' siempre son big-endian cuando forman parte de palabras de varios bytes).