免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1887 | 回复: 8
打印 上一主题 下一主题

[C] 位操作问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-18 20:33 |只看该作者 |倒序浏览
MP3帧头部格式如下
struct FrameHeader
{
        unsigned sync       : 11;
        unsigned version    : 2;
        unsigned layer      : 2;
        unsigned protection : 1;
        unsigned bitrate    : 4;
        unsigned frequency  : 2;
        unsigned padding    : 1;
        unsigned prvdata    : 1;
        unsigned mode       : 2;
        unsigned modeext    : 2;
        unsigned copyrht    : 1;
        unsigned original   : 1;
        unsigned emphasis   : 2;
};
能将数据正确读入该结构体,printf("%X", frmHeader.sync);却出现问题,本来是7FF,输出却是3FF,后边各成员输出也不对,请大侠指教!谢谢!

[ 本帖最后由 chaosfun 于 2008-10-18 20:34 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-18 21:21 |只看该作者
全部打出来看看有什么区别吧

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
3 [报告]
发表于 2008-10-18 21:29 |只看该作者

回复 #1 chaosfun 的帖子

就贴了那么点信息,你叫人怎么帮你解决呢????

论坛徽章:
0
4 [报告]
发表于 2008-10-18 22:09 |只看该作者
是啊,提供的信息太少了,怎么帮看

论坛徽章:
0
5 [报告]
发表于 2008-10-19 20:07 |只看该作者
不好意思!
用这个例子吧,看得比较清楚一点。

  1. struct FrameHeader
  2. {
  3.         unsigned sync       : 11;
  4.         unsigned version    : 2;
  5.         unsigned layer      : 2;
  6.         unsigned protection : 1;
  7.         unsigned bitrate    : 4;
  8.         unsigned frequency  : 2;
  9.         unsigned padding    : 1;
  10.         unsigned prvdata    : 1;
  11.         unsigned mode       : 2;
  12.         unsigned modeext    : 2;
  13.         unsigned copyrht    : 1;
  14.         unsigned original   : 1;
  15.         unsigned emphasis   : 2;
  16. }; //总共32位,占4个字节

  17.         struct FrameHeader frmhdr;
  18.         unsigned char buf[4];
  19.         buf[0] = 0xFF; //11111111
  20.         buf[1] = 0xFB; //11111011
  21.         buf[2] = 0xA0;
  22.         buf[3] = 0x40;
  23.         memcpy(&frmhdr, buf, 4);
  24.         printf("%X", frmhdr.sync);
复制代码

这种情况下,buf的最左边11位是7FF,但输出的frmhdr.sync却是3FF,百思不得其解!

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
6 [报告]
发表于 2008-10-19 21:01 |只看该作者
这个貌似不是位操作问题,是位域问题,

但是,记得位域好像不能超过8为位,不知道超过后,编译器是怎么搞的。

[ 本帖最后由 ilex 于 2008-10-19 21:14 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-10-19 21:10 |只看该作者
我想应该是要注意高低字节存放.如你定义的:
buf[0] = 0xFF; //11111111
        buf[1] = 0xFB; //11111011
        unsigned sync       : 11;
        unsigned version    : 2;
        unsigned layer      : 2;
        unsigned protection : 1;
在memcpy之后,结构体的连续的低16位存放的位0XFBFF,也就是11111011 11111111,你取*.sync时只取低
11位,就是3ff,取version就去12,13位,应为3,一次类推,layer为3,protection为1.

论坛徽章:
0
8 [报告]
发表于 2008-10-19 21:46 |只看该作者

回复 #7 luqc 的帖子

luqc大侠正解!同时也谢谢ilex大侠
困扰我老长时间的问题总算解决了,爽~~

论坛徽章:
0
9 [报告]
发表于 2008-10-20 18:24 |只看该作者
好好研究下位段吧 它不一定是紧凑排列的 当所需长度不够它会直接从下一字节开始,而且还要看对齐。这样以来中间肯定会多出一些空闲区域,建议在使用前memset为0,才操作,再查看相应的位是不是对的、
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP