- 论坛徽章:
- 13
|
本帖最后由 karma303 于 2016-06-26 09:27 编辑
结构体内bitfield的顺序是对byte endian敏感的。
并不是说x86或MIPS除了byte order之外,还有bit order的区别。
这个问题的根源在于编译器。纯粹是编译器作怪。展开讲话就多了。暂且不表。
不过我可以告诉你一个技巧,如果位域不跨字节的,大小端的变换是有规律的。
像小端模式的一个结构体:
struct abcdef {
int a: 4;
int b: 4;
int c: 4;
int d: 2;
int e: 2;
};
你想让它在MIPS上的gcc编译后有同样的内存布局,方法是:从上到下,位域每8个bit一组,反转组内的成员顺序。结果是这样:
struct abcdef {
int b: 4;
int a: 4;
int e: 2;
int d: 2;
int c: 4;
};
如果位域跨字节,那我就没有办法了。你贴出来的那个struct video什么的代码,我是看不懂的。
一般这种针对big/little endian的条件编译,是出于两种场合的需要。
(1)网络底层协议的传输,从host A传到 host B上,相当于一份远程的内存拷贝,网络协议必须规定这段内存(记作xxx)该以big or little endian的方式存放数据。 我们上面代码里#if #else条件编译,其实都是折腾编译器。我们希望我们的代码在MIPS和x86机器编译后,希望类似下面的代码的输出是一致的:
----------------------------------------------
struct tcphdr *hdr = (void *)xxx ;
printf( "%d\n", hdr->res1);
---------------------------------------------
(2) 驱动代码里,我们要把bitfield与寄存器对应死。
自己写的一篇帖子,希望对题主有帮助。http://bbs.chinaunix.net/forum.p ... =4248004&extra=
|
|