为什么8位字段具有字节序?

Cla*_*diu 15 c networking interop system endianness

请参阅/netinet/tcp.h中TCP头的定义:

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 */
};
Run Code Online (Sandbox Code Playgroud)

为什么8位字段的字节顺序不同?我认为只有16位和32位字段与字节顺序相关,你可以分别用ntoh和ntohl在字节之间进行转换.处理8位内容的功能是什么?如果没有,似乎在小端机器上使用此标头的TCP将无法在大端机器上使用TCP.

kcw*_*cwu 21

有两种顺序.一个是字节顺序,一个是位域顺序.关于C语言中的位域顺序没有标准顺序.这取决于编译器.通常,位域的顺序在大端和小端之间反转.


Lan*_*son 11

这是依赖于编译器的,不可移植的.如何对位字段进行排序依赖于实现,这里使用8位字段和移位/掩码来获得子字段要好得多.