【发布时间】:2019-01-16 18:43:51
【问题描述】:
我需要澄清字节顺序如何影响 C 结构中的位提取字段。
以下结构声明了 rtp 标头:
typedef struct {
#if BYTE_ORDER == BIG_ENDIAN
unsigned int version:2; /* protocol version */
unsigned int p:1; /* padding flag */
unsigned int x:1; /* header extension flag */
unsigned int cc:4; /* CSRC count */
unsigned int m:1; /* marker bit */
unsigned int pt:7; /* payload type */
#else
unsigned int cc:4; /* CSRC count */
unsigned int x:1; /* header extension flag */
unsigned int p:1; /* padding flag */
unsigned int version:2; /* protocol version */
unsigned int pt:7; /* payload type */
unsigned int m:1; /* marker bit */
#endif
unsigned int seq:16; /* sequence number */
uint32_t ts; /* timestamp */
uint32_t ssrc; /* synchronization source */
uint32_t csrc[0]; /* optional CSRC list */
} rtp_hdr_t;
由于字节序会影响内存中的字节顺序,我几乎不明白为什么在小端架构中以这种方式定义结构
谢谢
【问题讨论】:
-
您操作的 C++ 变量总是表现为大端。如果你对
int进行位操作,无论底层架构是大端还是小端(甚至是混合端),结果都是一样的。只有当您从程序外部的字节数组导出/导入数据时,您才需要关心。 -
我认为这样的
#ifdef根本没有必要。该代码的作者可能错过了使用 htonx()/ntohx() 函数在 c / c++ 代码中以透明的方式处理字节序。 -
这个问题是关于 C++,而不是 C。请去掉'c'标签
-
@user3629249 这个问题是如何只针对 c++ 的?
-
问题的名称/标题。问题的第一句话。
标签: c endianness