文档章节

字节序大端小端

i
 iblackangel
发布于 2017/04/10 14:26
字数 478
阅读 48
收藏 0

如果处理器架构支持大端 (big-endian) 字节序,那么最大字节地址对应于数字最低有效字节 (LSB) 上;小端 (little-endian) 字节序则相反:数字最低字节对应于最小字节地址。

《UNIX 环境高级编程》(第二版) P440

字节序

运行在同一台计算机上的进程相互通信时,一般不用考虑字节的顺序(字节序),字节序是一个处理器架构特性,用于指示像整数这样的大数据类型的内部字节顺序。下图显示一个 32 位整数内部的字节是如何排序的。

输入图片说明

Intel 平台为小端字节序,如果一个 32 位整数值 0x04030201,数字最高位为 0x04,数字最低位 0x01。以数组形式在内存中存储为:

输入图片说明

对应上面所说的:数字最低字节 (0x01) 对应于最小字节地址 n

查看系统是大端还是小端

在 Linux 系统中提供了 lscpu 命令可用来查看系统的字节序 (Byte Order):

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 42
Stepping:              7
CPU MHz:               1600.000
BogoMIPS:              6585.22
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

在 Linux 内核源码 2.6.14 中:

/* arch/arm/kernel/setup.c */
/* Line: 115-117 */
static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.l)

这段代码非常巧妙,利用在 union 中存储的数据从最低位开始存放的特性,如果是小端存放,则输出 l,如果大端存放,则输出 b

注意: 这段代码针对 32 位的 ARM 架构。如果你需要测试这段代码,最快捷的办法注释掉 __initdata 偷懒。

参考资料

[1] Linux 驱动开发研究

© 著作权归作者所有

共有 人打赏支持
i
粉丝 0
博文 47
码字总数 14784
作品 0
广州
程序员
私信 提问
理解字节序

1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。 举例来说,数值使用两个字节储存:高位字节是,低位字节是。 大端字节序:高位字节在前,低位...

阮一峰
2016/11/22
0
0
htonl、ntohl、htons、ntohs函数实现

typedef unsigned short int uint16; typedef unsigned long int uint32; // 短整型大小端互换 #define BigLittleSwap16(A) ((((uint16)(A) & 0xff00) >> 8) | (((uint16)(A) & 0x00ff) << 8......

OScoder2
2014/03/17
0
0
最简单的方式教你理解大小端字节序

学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题。 什么是字节序? 字节序,简单来...

暮回_梓
2018/06/26
0
0
网络通信之 字节序转换原理与网络字节序、大端和小端模式

一、在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。 原因如下:网络协议规定接收到得...

wqwqh
2018/05/28
0
0
网络通信之字节序转换原理与网络字节序、大端和小端模式

一、在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。 原因如下:网络协议规定接收到得...

断桥残雪断桥残雪
2015/07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部