|
发表于 2008-10-19 23:10:25
|
显示全部楼层
貌似出现了大小端问题. 楼主代码运行的平台是小端的吧. 这方面我没有查相关的文档, 但是我试着运行了一下程序, 根据为 buf 设置不同的数据, 我感觉 gcc 做了一些这样的操作 (以下针对小端系统):
* 尝试按 char/short/int 的顺序, 将连续的位域进行分组
* 组内会出现大小端问题
* 组内各个位域在小端系统上是按照比特序从低向高排列的
比如- struct {
- int a: 3;
- int b: 5;
- int c: 4;
- };
复制代码
a 和 b 刚好组合成一个 char 型, 因此在考虑 a, b 顺序时不必考虑 c, 如果 a 和 b 超出了 8 比特, 那么就要与后面的位域结合起来尝试组合成 short, 以至于 int.
a 先定义, 因此 a 从比特位低位开始放, 然后是 b. 按位来写的话, 就是 bbbbb aaa, 刚好与定义顺序相反.
如果是大端系统, 首先可以确定字节序是大端的, 但是不知在比特序上是否也会与小端系统相反. 明天找台大端机器试试.
根据以上经验结论, 我们可以将楼主的 struct 修改成以下形式- struct FrameHeader
- {
- //unsigned int sync : 11;
- unsigned int sync_h : 8;
- unsigned int protection : 1;
- unsigned int layer : 2;
- unsigned int version : 2;
- unsigned int sync_l : 3;
- unsigned int prvdata : 1;
- unsigned int padding : 1;
- unsigned int frequency : 2;
- unsigned int bitrate : 4;
- unsigned int emphasis : 2;
- unsigned int original : 1;
- unsigned int copyrht : 1;
- unsigned int modeext : 2;
- unsigned int mode : 2;
- };
复制代码 唯一的问题是, 这里由于 sync 域大于 8 比特, 因此在与后面的几个域组合成 short 后, 由于字节序问题, 无法描述. 因此只好把 sync 拆成了两部分, 实际使用时, sync := (sync_h << 3) | sync_l |
|