Warum hat ein 8-Bit-Feld Endianness?

Lesezeit: 3 Minuten

Siehe die Definition des TCP-Headers in /netinet/tcp.h:

struct tcphdr
  {
    u_int16_t th_sport;         /* source port */
    u_int16_t th_dport;         /* destination port */
    tcp_seq th_seq;             /* sequence number */
    tcp_seq th_ack;             /* acknowledgement number */
#  if __BYTE_ORDER == __LITTLE_ENDIAN
    u_int8_t th_x2:4;           /* (unused) */
    u_int8_t th_off:4;          /* data offset */
#  endif
#  if __BYTE_ORDER == __BIG_ENDIAN
    u_int8_t th_off:4;          /* data offset */
    u_int8_t th_x2:4;           /* (unused) */
#  endif
    u_int8_t th_flags;
#  define TH_FIN        0x01
#  define TH_SYN        0x02
#  define TH_RST        0x04
#  define TH_PUSH       0x08
#  define TH_ACK        0x10
#  define TH_URG        0x20
    u_int16_t th_win;           /* window */
    u_int16_t th_sum;           /* checksum */
    u_int16_t th_urp;           /* urgent pointer */
};

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.

  • Nein, es ist eindeutig beabsichtigt, zwei 4-Bit-Felder zu definieren. Siehe zB freesoft.org/CIE/Course/Section4/8.htm für TCP-Header-Layout.

    – Lanze Richardson

    14. Mai 2009 um 15:46 Uhr

Benutzeravatar von bearsinthesea
Bärenindiesen

Es kann hilfreich sein zu wissen, dass dieser Code nur ausgeführt wird, wenn “# ifdef __FAVOR_BSD”. Es ist aus /usr/include/netinet/tcp.h

# ifdef __FAVOR_BSD
typedef u_int32_t tcp_seq;
/*
 * TCP header.
 * Per RFC 793, September, 1981.
 */
struct tcphdr

  • Nein, es ist eindeutig beabsichtigt, zwei 4-Bit-Felder zu definieren. Siehe zB freesoft.org/CIE/Course/Section4/8.htm für TCP-Header-Layout.

    – Lanze Richardson

    14. Mai 2009 um 15:46 Uhr

1432730cookie-checkWarum hat ein 8-Bit-Feld Endianness?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy