struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD
来源:互联网 发布:飞鸟淘宝客学习 编辑:程序博客网 时间:2024/05/21 21:01
__LITTLE_ENDIAN_BITFIELD表示小端序,__BIG_ENDIAN_BITFIELD表示大端序。
/usr/include/linux/ip.h中有一段代码定义了ip首部的结构体,如下:
struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD)__u8ihl:4,version:4;#elif defined (__BIG_ENDIAN_BITFIELD)__u8version:4, ihl:4;#else#error"Please fix <asm/byteorder.h>"#endif__u8tos;__be16tot_len;__be16id;__be16frag_off;__u8ttl;__u8protocol;__sum16check;__be32saddr;__be32daddr;/*The options start here. */};
这里的:4是C语言中的位域,是指取二进制中的低四位(在大端序中这个低四位是存储在高地址的)。
如果使用者只允许直接对ihl或者version成员,那么这一段代码可以不用判断是大端序或者小端序。
但使用者可能使用memcpy来直接对这开头的8位进行赋值操作,而在大端序和小端序的机器上会产生不同的情况。
比如下面这段代码:
u_int16_t x = 0x1;u_int8_t xx[2];memcpy(xx, x);
在小端序的机器上结果应该是
x[0] x[1]
---------
10 .. 00
而在大端序的机器上结果则是
x[0] x[1]
---------
00 .. 01
注意x[1]的地址都是比x[0]高的。
因此为了提高兼容性(程序可以被小端序和大端序的机器共用),需要预先判断是大端序还是小端序,并调换ihr和version在内存中的位置。
0 0
- struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD
- struct--iphdr -- IP头部
- struct--iphdr -- IP头部
- struct--iphdr -- IP头部
- struct--iphdr -- IP头部
- struct--iphdr -- IP头部
- struct--iphdr -- IP头部
- struct iphdr详解
- redefinition of 'struct iphdr'
- struct iphdr详解
- struct--iphdr -- IP头部
- struct iphdr IP头部与tcphdr tcp头部与linux中的struct IP IP头部
- struct ip 和struct iphdr的差别 , <netinet/*.h>和<linux/*.h>
- 【转】struct--iphdr -- IP头部
- error: redefinition of 'struct iphdr'
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- [struct--iphdr -- IP头部]与[tcphdr结构]
- struct ethhdr、ether_header、iphdr、tcphdr、udphdr
- Adobe Flash Player ActiveX 不能安装
- Search a 2D Matrix
- opencl入门介绍
- 1402 最大值
- 代码雨
- struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD
- 程序员你造吗?2016年加州将建造子弹头火车,你还在CODE?
- Android-Universal-Image-Loader 图片异步加载类库的使用
- Ubuntu终端安装JDK
- Mysql存储过程
- [BZOJ 2083] Poi 2010 Intelligence test · 二分
- Python入门
- 再读effective c++
- Android利用Fiddler进行网络数据抓包