aist ein Zeiger auf ein Array von Bytes. Wenn Sie es in ein uint16_t umwandeln und es zuweisen b, benthält es die Adresse der Basis des Arrays (wo es gespeichert ist) im SRAM. Wenn Sie die beiden Bytes des Arrays aals 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, ain 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).