C 为什么8位字段具有endianness?

C 为什么8位字段具有endianness?,c,networking,interop,system,endianness,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; /* acknowledge

请参见/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 */
};

为什么8位字段的endianness顺序不同?我认为只有16位和32位字段与字节顺序有关,您可以分别使用ntoh和ntohl在endian之间进行转换。处理8位事物的函数是什么?如果没有,则在小端计算机上使用此标头的TCP似乎无法与在大端计算机上使用的TCP一起工作。

我对这条评论的理解是,两个单字节字段一起被解释为一个双字节值(或者,似乎一个字节没有使用)。它们不是声明一个两字节的值,而是声明两个一字节的值,但根据端点的大小颠倒声明的顺序。

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

在这台机器中,端可能也指位顺序和字节顺序。提到有时会出现这种情况

这依赖于编译器且不可移植。位字段的排序方式取决于实现,这里最好使用8位字段和移位/掩码来获得子字段。

我的理解是,位排序和端序通常是两件不同的事情。带有位字段的结构通常不能跨编译器/体系结构移植。有时IFDEF可用于支持不同的位顺序。在这种情况下,endianness实际上是不相关的,它应该是关于位顺序的ifdef。在某些情况下,某些Endianeses具有特定位顺序的假设可能是正确的。

知道这是只有在“#ifdef uu FAVOR_BSD”时才运行的代码可能会有所帮助。它来自/usr/include/netinet/tcp.h

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

真奇怪,你在哪个系统上找到了这个头文件?DebianLinux。如果定义了“使用”BSD,则包含此版本。否,它显然打算定义两个4位字段。请参阅TCP头布局。在这个问题中,它与位顺序无关。这似乎是正确的答案,我模糊地记得以前听过它,但我凭良心无法在没有引用的情况下投票。。。你能提供一个吗?这是唯一对我有意义的答案,不是吗?或者他们含蓄地假设字节顺序和位字段顺序之间的endianness保持不变?对我来说,听起来是个更好的计划。