免费注册 查看新帖 |

Chinaunix

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

[网络子系统] tcp报文收发时, data offset 的ushort是否需要做字节序转换? [复制链接]

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
1 [报告]
发表于 2016-06-26 09:22 |显示全部楼层
本帖最后由 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=
  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP