免费注册 查看新帖 |

Chinaunix

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

[其他] ip头部长度的问题,求解答 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-02 20:29 |只看该作者 |倒序浏览
struct ip
  {
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ip_hl:4;                /* header length */
    unsigned int ip_v:4;                /* version */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int ip_v:4;                /* version */
    unsigned int ip_hl:4;                /* header length */
#endif

上面是linux的系统源文件定义的ip头部的一部分,我想问的是:既然字节序对一个字节没有影响,为什么还要分大端、小端哪?
如果我自己定义的ip头结构如下:
struct ip_header{
        u_int8_t ip_verlen;
        u_int8_t ip_tos;
        u_int16_t ip_len;
        u_int16_t ip_id;
        u_int16_t ip_off;          //包括三位标志和13位偏移m
        u_int8_t  ip_ttl;
        u_int8_t  ip_protocal;    //标识ICMP、IGMP、UDP、 TCP
        u_int16_t   ip_checksum;
        struct in_addr ip_source_address;
        struct in_addr ip_dst_address;
};
ip的头部长度为什么不是取高4位哪??而是ip_header_len = (ipHeader->ip_verlen & 0x0f)<<2;,取低4位

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2014-07-02 22:43 |只看该作者
位域的实现跟字节序有关

论坛徽章:
0
3 [报告]
发表于 2014-07-03 10:00 |只看该作者
回复 2# hellioncu


    我去查下位域的资料。但是自己定义那个结构哪??那个不是位域啊!!为什么还是取低位哪??

论坛徽章:
1
戌狗
日期:2014-07-17 19:24:40
4 [报告]
发表于 2014-07-03 13:05 |只看该作者
这么来说吧,大端序如:01234567
其中0123是version,而4567是len
这个值到了小端序的机器就成了:76543210
这个时候,你拿最前面的4个bit的结果就是version,version变成了:7654
len变成了3210了。
为了保证取到的前4个位是version,所以做了大小端序的处理。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2014-07-03 13:32 |只看该作者
  1. #if __BYTE_ORDER == __LITTLE_ENDIAN
  2.     unsigned int ip_hl:4;                /* header length */
  3.     unsigned int ip_v:4;                /* version */
  4. #endif
  5. #if __BYTE_ORDER == __BIG_ENDIAN
  6.     unsigned int ip_v:4;                /* version */
  7.     unsigned int ip_hl:4;                /* header length */
  8. #endif
复制代码
这样定义原则上是不行的(编译器依存), 你可以向kenerl开发小组发Bug issue.
这样定义是基于以下事实的: 在BIG_ENDIAN编译环境下,
位域分配顺序是从高到低的。(当然这并不是完全正确的)。

最好的办法还是自已 <<。



论坛徽章:
0
6 [报告]
发表于 2014-07-12 15:23 |只看该作者
回复 4# kprc
不对吧!!大小端只对一个字节范围内有作用吧??!!不会一个字节内也会倒序吧??


   

论坛徽章:
0
7 [报告]
发表于 2014-07-12 15:53 |只看该作者
回复 5# folklore
恩,我看了些资料这样定义确实不好。针对大小端机器,比特序是不确定的!!但是我写的那个结构体类??还是没有解答我的问题啊??


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP