Warum hat das 8-Bit-Feld eine andere Endian-Reihenfolge? Ich dachte, nur 16-Bit- und 32-Bit-Felder spielten eine Rolle bei der Byte-Reihenfolge, und Sie könnten zwischen Endian mit ntohs bzw. ntohl konvertieren. Was wäre die Funktion für die Handhabung von 8-Bit-Dingen? Wenn es keine gibt, scheint es, dass ein TCP, das diesen Header auf einer Little-Endian-Maschine verwendet, nicht mit einem TCP auf einer Big-Endian-Maschine funktionieren würde.
Seltsam, auf welchem System haben Sie diese Header-Datei gefunden?
– fbonnet
14. Mai 2009 um 15:40 Uhr
Debian-Linux. diese Version ist enthalten, wenn __USE_BSD #definiert ist.
– Claudius
14. Mai 2009 um 16:01 Uhr
Es gibt zwei Arten von Bestellungen. Einer ist die Byte-Reihenfolge, einer ist die Bitfeld-Reihenfolge. Es gibt keine Standardreihenfolge für die Bitfeldreihenfolge in der Sprache C. Es kommt auf den Compiler an. Typischerweise wird die Reihenfolge der Bitfelder zwischen Big und Little Endian umgekehrt.
Dies scheint die richtige Antwort zu sein, und ich erinnere mich vage, sie schon einmal gehört zu haben, aber ich kann ohne Zitat nicht guten Gewissens dafür stimmen … können Sie eine angeben?
– rméador
14. Mai 2009 um 15:53 Uhr
das ist für mich die einzig sinnvolle antwort
– Claudius
14. Mai 2009 um 16:01 Uhr
sollte das dann nicht __BIG_ENDIAN_BITFIELD/__LITTLE_ENDIAN_BITFIELD sein? Oder gehen sie implizit davon aus, dass die Endianness zwischen Byte- und Bitfeld-Ordnungen gleich bleibt?
– Slava
18. Oktober 2017 um 14:51 Uhr
Dies ist Compiler-abhängig und nicht portierbar. Wie Bitfelder geordnet werden, hängt von der Implementierung ab, es wäre hier viel besser, ein 8-Bit-Feld und eine Verschiebung/Maske zu verwenden, um die Unterfelder zu erhalten.
Klingt für mich nach einem besseren Plan.
– Dave Cluderay
15. Mai 2009 um 0:43 Uhr
Es ist möglich, dass sich in dieser Maschine die Endianness auch auf die Bit-Reihenfolge sowie die Byte-Reihenfolge bezieht. Dieser Wikipedia-Artikel erwähnt, dass dies manchmal der Fall ist.
In dieser Frage hat es keine Beziehung zur Bitreihenfolge.
– kcwu
14. Mai 2009 um 15:48 Uhr
Mein Verständnis ist, dass Bitreihenfolge und Endianness im Allgemeinen zwei verschiedene Dinge sind. Strukturen mit Bitfeldern sind im Allgemeinen nicht über Compiler/Architekturen hinweg portierbar. Manchmal können ifdefs verwendet werden, um unterschiedliche Bitreihenfolgen zu unterstützen. In diesem Fall ist die Endianness wirklich irrelevant und es sollte ein ifdef über die Bitreihenfolge sein. Die Annahme, dass einige Endiannesses eine bestimmte Bitreihenfolge haben, kann in einigen Fällen zutreffen.
Meine Lektüre des Kommentars ist, dass die beiden Ein-Byte-Felder zusammen als Zwei-Byte-Wert ausgelegt werden (oder waren – scheint sowieso ein Byte unbenutzt zu sein). Anstatt einen Zwei-Byte-Wert zu deklarieren, deklarieren sie zwei Ein-Byte-Werte, kehren aber die Deklarationsreihenfolge je nach Endian-Niveau um.
Seltsam, auf welchem System haben Sie diese Header-Datei gefunden?
– fbonnet
14. Mai 2009 um 15:40 Uhr
Debian-Linux. diese Version ist enthalten, wenn __USE_BSD #definiert ist.
– Claudius
14. Mai 2009 um 16:01 Uhr