__LITTLE_ENDIAN_BITFIELD表示小端序,__BIG_ENDIAN_BITFIELD表示大端序。

/usr/include/linux/ip.h中有一段代码定义了ip首部的结构体,例如以下:

struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
/*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在内存中的位置。

struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD的更多相关文章

  1. struct iphdr

    struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:, version:; #elif defined (__BIG_ENDIA ...

  2. golang struct 定义中json``解析说明

    在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下 package main import ( "enco ...

  3. 【转】在Python的struct模块中进行数据格式转换的方法

    这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...

  4. struct stat中的mode_t

    mode_t是无符号整形.它由 S_IRUSR S_IWUSR S_IXUSR S_IRGRP S_IWGRP S_IXGRP S_IROTH S_IWOTH S_IXOTH几个按位或而的来:所得到的 ...

  5. python struct.pack中的对齐字节问题

    最近测试涉及到了序列字节化相关问题,碰到一个头疼的问题 buff = struct.pack("3s","B00")    print repr(buff) 输 ...

  6. struct streaming中的监听器StreamingQueryListener

    在struct streaming提供了一个类,用来监听流的启动.停止.状态更新 StreamingQueryListener 实例化:StreamingQueryListener 后需要实现3个函数 ...

  7. struct platform_device中的id成员

    include/linux/platform_device.h #define PLATFORM_DEVID_NONE (-1) #define PLATFORM_DEVID_AUTO (-2) dr ...

  8. Linux网络驱动--snull

    snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...

  9. 数据包接收系列 — IP协议处理流程(一)

    本文主要内容:在接收数据包时,IP协议的处理流程. 内核版本:2.6.37 Author:zhangskd @ csdn blog IP报头 IP报头: struct iphdr { #if defi ...

随机推荐

  1. cocos2dx当节点存在缩放时要注意的问题

    cocos2dx(所有引擎也均如此),如果一个节点存在缩放,一定不要忘了其局部空间里的单位长度也会发生变化.其子节点位移,局部空间转世界空间结果等都会受影响. 有时候我们想将父节点的缩放转移到子节点中 ...

  2. 怎么从docker中copy文件到 本机

    怎么从docker中copy文件到 本机 docker cp <containerId>:/file/path/within/container /host/path/target

  3. 【Android】第21章 2D图形和动画

    分类:C#.Android.VS2015: 创建日期:2016-03-19 一.简介 Android系统定义了一系列独立的图形处理类,其中,2D图形处理类分别位于以下命名空间: Android.Gra ...

  4. google protocol buffer的原理和使用(三)

    介绍下怎么反序列化GoogleBuffer数据.并在最后提供本系列文章中所用到的代码整理供下载. 上一篇文章介绍了如何将数据序列化到了addressbook.data中.那么对于接受方而言该怎么解析出 ...

  5. 改变mysql数据库用户的权限

    mysql> grant all on *.* to test@'%';Query OK, 0 rows affected (0.00 sec) mysql> flush privileg ...

  6. Build IKAnalyzer With Solr 5.1.0

    中文分詞裡IKAnalyzer和結巴是大家比較常用的分詞器, 不過IKAnalyzer已經很久沒有更新了, IKAnalyzer中文分词器V2012使用手册也跟IK Analyer 2012-FF H ...

  7. vue打包空白,图片没加载,背景颜色没有渲染出来-配置秘诀

    找到config文件夹下的index.js文件修改一下位置 看清楚是 build(上边还有个dev 是开发环境下的配置,不需要改动)下的 assetsPublicPath :将‘/’改为‘./’ 在c ...

  8. Activiti初学者教程 (zhuan)

    http://blog.csdn.NET/bluejoe2000/article/details/39521405 ****************************************** ...

  9. 在ajax post处理文件下载

    我有一个JavaScript应用程序需要使用ajax post请求发送到某个URL,然后后端会根据请求中的参数进行相应的工作,生成一个可下载的压缩包,等待下载.必须使用的ajax的原因是这里需要模拟提 ...

  10. js压缩图片并上传,不失真,保证图片清晰度

    <!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...