Abgesehen davon, gibt es einen anderen Nachteil, den ich vermisse?
Ich fürchte, Sie haben die Art der Endian Conversion-Probleme missverstanden. "Big Endian" bedeutet nicht, Ihre Felder werden in umgekehrter Reihenfolge angelegt, so dass ein
struct msg1_bigendian
{
int32 a;
int16 b;
uint32 c
}
auf einer Big-Endian-Architektur zu einem
entsprechen
struct msg1_littleendian
{
uint32 c;
int16 b;
int32 a;
}
auf einer Little-Endian-Architektur. Es bedeutet vielmehr, dass die Byte-Reihenfolge innerhalb jedes Feld umgekehrt ist.Nehmen wir an:
a = 0x1000000a;
b = 0xb;
c = 0xc;
Auf einem Big-Endian-Architektur, wird dies als verlegt werden:
10 00 00 0a
00 0b
00 00 00 0c
Die hohe Ordnung (höchstwertigen) Byte an erster Stelle.
0a 00 00 10
0b 00
0c 00 00 00
Die niedrigste Byte zuerst kommt, die höchste Ordnung letzte:
Auf einer Little-Endian-Maschine, wird dies als verlegt werden.
serialisiert sie und überlagern die serialisierte Form der Nachrichten auf der jeweils anderen, und Sie werden die Inkompatibilität entdecken:
10 00 00 0a 00 0b 00 00 00 0c (big endian)
0a 00 00 10 0b 00 0c 00 00 00 (little endian)
int32 a int16 b int32 c
Beachten Sie, dass dies nicht einfach ein Fall der Felder läuft in umgekehrter Richtung. Ihr Vorschlag würde dazu führen, dass ein kleines Endian-Gerät die Big-Endian-Darstellung wie folgt interpretiert:
a = 0xc000000; b = 0xb00; c = 0xa000010;
Sicher nicht was übertragen wurde!
Sie müssen wirklich jedes einzelne Feld in Netzwerk-Byte-Reihenfolge und wieder zurück konvertieren, für jedes übertragene Feld.
UPDATE:
Ok, ich verstehe, was Sie jetzt zu tun versuchen. Sie möchten die Struktur in umgekehrter Reihenfolge definieren, dann memcpy von Ende der Byte-Zeichenfolge an den Anfang (umgekehrte Kopie) und umgekehrt die Byte-Reihenfolge auf diese Weise. In diesem Fall würde ich sagen, ja, das ist ein Hack, und ja, es macht Ihren Code unportierbar, und ja, es ist es nicht wert. Das Konvertieren zwischen Byte-Ordnungen ist in der Tat keine sehr teure Operation, und es ist viel einfacher, damit umzugehen, als das Layout jeder Struktur umzukehren.
FYI: Sie können den Code besser formatieren, indem Sie alles auswählen und STRG + K drücken. – JaredPar
Beachten Sie, dass #pragma pack (1) auf vielen Computern keine Bedeutung hat. –