Ich bin ein wenig verwirrt darüber, wie Bytes in einem struct
geordnet sind.Reihenfolge der Bytes in Struct
Sagen wir, ich habe folgende Struktur:
struct container {
int myint;
short myshort;
long mylong;
};
Nun, ich möchte eine Variable vom Typ initialisieren struct container
ebenso wie die folgenden, mit der Ausnahme, dass ich wollen tun es mit einem Array.
struct container container1 = {.myint = 0x12345678,
.myshort = 0xABCD,
.mylong = 0x12345678};
Angenommen sizeof
int
und long
4
sind und dass der short
2
ist.
Angenommen, es gibt keine Polsterung. Wie wäre dann das Layout der 10 bytes
struct
?
Kommt es auf die Endianness an?
Wäre es wie:
0x12345678 ABCD 12345678
oder wie:
0x78563412 CDAB 78563412
Was ich tun möchte, ist: Ich habe folgendes char-Array:
char buffer[10] = {0};
Ich möchte um dieses Array manuell mit Daten zu füllen und dann memcpy
an die struct
.
Sollte ich tun [1]:
buffer[0] = 0x12345678 & 0xFF;
buffer[1] = 0x12345678 >> 8 & 0xFF;
buffer[2] = 0x12345678 >> 16 & 0xFF;
buffer[3] = 0x12345678 >> 24 & 0xFF;
...
buffer[9] = 0x12345678 >> 24 & 0xFF;
oder sollte es sein [2]:
buffer[0] = 0x12345678 >> 24 & 0xFF;
buffer[1] = 0x12345678 >> 16 & 0xFF;
buffer[2] = 0x12345678 >> 8 & 0xFF;
buffer[3] = 0x12345678 & 0xFF;
...
buffer[9] = 0x12345678 & 0xFF;
, bevor ich meine tun memcpy
wie:
memcpy(&container1, buffer, sizeof(container1);
Und wenn ich wr bin iting zu einem Array und kopieren zu struct
, Ist es über Systeme, besonders in Bezug auf endianness portabel?
EDIT: Does [1] Arbeit an einer Little-Endian-Maschine und [2] auf einem Big-Endian?
Nein, es ist nicht tragbar. Ja, es kommt auf Endianness an. Und die Annahmen über Padding und die Größe der Typen werden auch zu Portabilitätsproblemen führen. – user3386109
Um * keine portable Möglichkeit * zu betonen, bedeutet das keine portable Möglichkeit vom Compiler zum Compiler auf dem gleichen Betriebssystem, viel weniger portabel von OS zu OS. –
Natürlich hängt es von Endianness ab! Nach Ihrer Annahme "es gibt keine Auffüllung" hat die Frage nichts mehr mit Strukturtypen zu tun. Es geht einfach darum, ganze Zahlen im Speicher darzustellen. – AnT