a
ist ein Zeiger auf ein Array von Bytes. Wenn Sie es in ein uint16_t umwandeln und es zuweisen b
, b
enthält es die Adresse der Basis des Arrays (wo es gespeichert ist) im SRAM. Wenn Sie die beiden Bytes des Arrays a
als Ganzzahl behandeln möchten , verwenden Sie eine Union, wie von user14284 vorgeschlagen. Beachten Sie jedoch, dass die Union das Byte-Array in der Reihenfolge der Speicherbytes der Architektur darstellt (in AVR wäre das wenig -endian, was bedeutet, dass Byte 0 das niedrigstwertige Byte ist). Der Weg, dies in Code zu schreiben, ist:
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
Eine andere Möglichkeit, dies ohne Verwendung einer Union zu tun, besteht darin, a
in einen uint16_t-Zeiger umzuwandeln und ihn dann wie folgt zu dereferenzieren:
uint8_t a[2] = {0x35, 0x4A};
uint16_t b = *((uint16_t *) a);
b == 0x4A35; // because AVR is little endian
Wenn Sie den Puffer zum Speichern von Big-Endian-Daten verwenden (z. B. Netzwerkbyte-Reihenfolge), müssen Sie einen Byte-Swap durchführen, um eine dieser Techniken zu verwenden. Eine Möglichkeit, dies ohne Verzweigungen oder temporäre Variablen zu tun, ist:
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
Dies ist übrigens kein AVR- oder sogar ein Embedded-Only-Problem. Application - Level - Netzwerk - Code für PCs geschrieben typischerweise Anrufe Funktionen genannt htonl
, htons
(Host - Netzwerk, 32- und 16-Bit - Varianten) und ntohl
, ntohs
(Netzwerk - Host, 32- und 16-Bit - Varianten) , deren Implementierungen sind Zielarchitektur abhängig, ob sie Tauschen Sie die Bytes aus oder nicht (unter der Annahme, dass die auf der Leitung übertragenen Bytes immer Big-Endian sind, wenn sie Teil von Mehrbyte-Wörtern sind).