c - 字节序如何影响结构中的位域定义?
问题描述
使用 iphdr 作为第一个示例:
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
/* other fields are emitted. */
};
我的问题 1,据我所知,字节序仅在处理多字节时才会影响,换句话说,如果只有 1 个字节,就没有“位顺序”这样的事情。在上面的定义中,ihl+version= 8 bits = 1 byte,ihl 和 version 驻留在一个字节中,我们为什么要关心 ihl 和 version 的字节顺序和倒序呢?
如果“位顺序”是一个问题,我的问题 2 是为什么另一个 struct ip_options 不关心字节顺序?
struct ip_options {
__be32 faddr;
__be32 nexthop;
unsigned char optlen;
unsigned char srr;
unsigned char rr;
unsigned char ts;
unsigned char is_strictroute:1, // why this byte doesn't care endianness?
srr_is_hit:1,
is_changed:1,
rr_needaddr:1,
ts_needtime:1,
ts_needaddr:1;
unsigned char router_alert;
unsigned char cipso;
unsigned char __pad2;
unsigned char __data[0];
};
解决方案
C 不需要字节字节序来指示是__u8 ihl:4
使用 4 个 MSBits 还是 4 个 LSBits。
为什么我们要关心 ihl 和版本的字节顺序和倒序?
原作者可能想覆盖struct iphdr
一个硬件地址,玩union
魔术或实现某种串行通信顺序。
该方法的可移植性不高,但可能已经满足了最初的有限需求。
如果“位顺序”是一个问题,我的问题 2 是为什么另一个 struct ip_options 不关心字节顺序?
这是一种反复无常。
处理标题后的字节序可能无关紧要。标头类型struct iphdr
可能需要与字节序无关的编码,但是一旦分配了这些成员,剩余的代码就会相应地进行解释。如果除标题之外的所有内容都具有#if defined(__LITTLE_ENDIAN_BITFIELD)
.
.tiff做了这样的事情。
推荐阅读
- linux - 如何让环境变量在 Bash 上持续存在?
- python - NDlib 独立级联初始化给了我一个错误
- javascript - 在 React 中将数据从一个组件传递到另一个组件的问题
- matlab - MATLAB杠杆()计算
- r - 如何通过 Lambda|API Gateway 访问 Dockerized R 镜像?
- cakephp-3.0 - 保存复杂的多对多关联 CakePHP 4
- python - Python Pandas 添加 DataRow 修订号
- r - R如何根据以下行中的条件过滤数据框?
- sql - 来自嵌套 JSON 数组的 MarkLogic TDE XPath 值
- javascript - 获取新数组后组件未更新