C 为什么8位字段具有endianness?
请参见/netinet/TCP.h中TCP头的定义: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
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保持不变?对我来说,听起来是个更好的计划。