我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。
在网络编程的时侯,因为端口号要进行字节序列的转换,涉及endian:
Big endian: 当存储一个超过一个字节的数据类型时,将其中的高位放在低地址的地方,低位放在高地址的地方。
Little endian: 于Big endian恰恰相反。
File: include/linux/ip.h

82 struct iphdr {
83 #if defined(__LITTLE_ENDIAN_BITFIELD)
84 __u8 ihl:4,
85 version:4;
86 #elif defined (__BIG_ENDIAN_BITFIELD)
87 __u8 version:4,
88 ihl:4;
89 #else
90 #error "Please fix <asm/byteorder.h>"
91 #endif
92 __u8 tos;
93 __be16 tot_len;
94 __be16 id;
95 __be16 frag_off;
96 __u8 ttl;
97 __u8 protocol;
98 __u16 check;
99 __be32 saddr;
100 __be32 daddr;
101 /*The options start here. */
102 };

当看到83-91行的代码的时侯,难道在小于自己单位的bit之中也存在endian的问题?
当需要用多个字节来描述一个数据类型,或者是一个数据结构中包含多个字段时,各个字段和存储区块中的地址的映射关系如下:

  • big endian: 存储的区块按照地址从低到高的顺序以字节为单位从左到右排列,划分字段的时侯,从左到右依次划分。
  • little endian: 存储的区块按照地址从高到低的顺序以字节为单位从左到右排列,划分的时侯,从右到左依次划分。

现在简单的给大家举几个简单的例子:

u_int16_t x = 0x1;
u_int8_t xx[2];
memcpy(xx, x);

在上面的代码中,最终xx[0]和xx[1]都是什么呢?
答案是不固定的,如果是在big endian的计算机上:
应用第一条规则,从xx中从取出两个字节x[0], x[1]。我们知道x[1]的地址肯定比x[0]高,所以排列如下:

x[0] x[1]
---------
15 ... 0
---------
00 01

很明显x[0] == 0, x[1] == 1.
如果是little endian的计算机:
应用第二条规则:

x[1] x[0]
---------
15 ... 0
---------
00 01

结果为x[0] == 1, x[1] == 0.
仔细看看结论是不是和在文章开始的判别方法给出的结论是相同的?所以在一定程度上,我们可以认为前一个结论是后一个结论的推论。
让我们看个更加复杂一点的例子:

union {
u_int16_t num;
struct {
u_int8_t a4 : 4;
u_int8_t b8;
u_int8_t c4 : 4;
} b;
} a;
a.b.a4 = 0x01;
a.b.b8 = 0x0203;
a.b.c4 = 0x04;
a.num = ?
 

这个是不是复杂了很多,不要说实际中这样的应用不多,看看Linux内核中数据结构你就会明白,类似结构还是蛮多的。
当然又是和endian有关的问题,分类分析了:
big endian:

---------------------
| 7-4|3-0 | 7-4|3-0 |
---------------------
| a[0] | a[1] |
---------------------
| a4 | b8 | c4 |
---------------------
| 01 | 02 | 03 | 04 |
---------------------
| 0x01020304 |
---------------------

所以,a.num = 0x01020304
little endian:

---------------------
| 7-4|3-0 | 7-4|3-0 |
---------------------
| a[1] | a[0] |
---------------------
| c4 | b8 | a4 |
---------------------
| 04 | 02 | 03 | 01 |
---------------------
| 0x04020301 |
---------------------

所以,a.num = 0x04020301

About Endian相关推荐

  1. byte endian(biglittle endian)

    1. 大小端的区别 little endian:把低位字节存放在内存的低位; // big endian:   将低位字节存放在内存的高位; 比如:0x1234,则12 就属于高位字节:34 属于低位 ...

  2. 字符编码简介 ANSI Unicode Unicode big endian UTF-8

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和 1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte) ...

  3. redis源码笔记-endian

    对于目标机是大端字节序的机器,进行字节码的转换,提供了16byte.32byte.64byte字节的转换.在intset\ziplist\zipmap三种数据结构中使用,使得不同字节序机器生成的rdb ...

  4. 关于endian的故事,big-endian和little-endian

    为什么80%的码农都做不了架构师?>>>    在各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特. ...

  5. c语言中.h文件中的宏定义,endian.h这个头文件里面的宏可以直接用么?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 endian.h头文件中以宏的形式定义了大端字节序.小端字节序和混合字节序 #define __LITTLE_ENDIAN 1234 #define __ ...

  6. 大端(Big Endian)与小端(Little Endian)详解

    大端(Big Endian)与小端(Little Endian)简介 /// 1. 你从哪里来? 端模式(Endian)的这个词出自JonathanSwift书写的<格列佛游记>.这本书根 ...

  7. big and little endian

    总是容易搞混big endian 和 little endian,但是找到一篇文章,其解释让人耳目一新. 文章链接:http://www.cs.umd.edu/class/sum2003/cmsc31 ...

  8. big endian and little endian

    big endian(大端)和little endian(小端)表示机器对变量字节的存储顺序.big endian表示低地址存放最高有效字节,little endian表示低地址存放最低有效字节.这里 ...

  9. Endian Bitfiled

    Endianess是个比较tricky的问题,特别是当数据在不同类型间转换时. 先看看在一台32位的little-endian机器上,以下代码的行为: C代码   #include <stdio ...

  10. 字节序是什么?(大小端 Big endian Little endian)

    字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前. 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序. 常见序: Little endian: 将 ...

最新文章

  1. 全局声明宏定义_Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路...
  2. 递归求解并生成哈夫曼编码的代码实现
  3. d3 力导向图 force graph
  4. ios获取手机 meid_共享充电宝并不简单,iOS也顶不住,隐私信息直接暴露
  5. 自定义checkbox样式
  6. 2021新茶饮研究报告
  7. 2019年文章精选,分类整理,顺带聊几句时间观念
  8. 带你换个角度理解图卷积网络
  9. 【js】event(事件对象)详解
  10. 使用iframe设置frameset的高度
  11. C++产生指定范围内的随机数/随机小数
  12. MSE(Media Source Extensions)介绍
  13. 那些不知所措的运算符优先级
  14. python+selenium 使用for循环,遍历 定位 获取 单个元素中想要的值
  15. 银河麒麟鸿蒙计划,银河麒麟Kydroid2.0发布,支持海量安卓APP,要抢鸿蒙的风头吗?...
  16. PP实施经验分享(11)——SAP订单信息系统COOIS应用*增强版*
  17. HP-OMEN-暗夜精灵8,安装WIN10
  18. .net基础学java系列(五)慢性自杀 之 沉沦在IDE中
  19. 机动车排放微观控制-汽油机内净化技术
  20. DUILIB异形窗口实现

热门文章

  1. HTTP hijack
  2. 尝遍裸辞各种苦,再也不敢任性裸辞了!
  3. sql统计各部门的的男女员工数
  4. 开发人员如何规划自己的职业生涯
  5. 塞班专用签名工具_Symbian平台的开源Web开发工具
  6. 2022智源大会议程公开 | 视觉模型论坛
  7. LeetCode题解(1682):最长回文子序列II(Python)
  8. Android Studio 项目运行错误,弹出“Detected ADB对话框”
  9. vue+websocket+nodejs实现聊天室 -一对多、一对一聊天
  10. 100道经典AI面试题帮你搞定算法offer!