【转】理解字节序 大端字节序和小端字节序
转自:https://www.cnblogs.com/gremount/p/8830707.html
以下内容参考了
http://www.ruanyifeng.com/blog/2016/11/byte-order.html
https://blog.csdn.net/yishengzhiai005/article/details/39672529
1.
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。
举例来说,数值0x2211
使用两个字节储存:高位字节是0x22
,低位字节是0x11,那么大小端存储有以下协议:
- 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
- 小端字节序:低位字节在前,高位字节在后,即以
0x1122
形式储存。
同理,0x1234567
的大端字节序和小端字节序的写法如下图。
2.
我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?
上周,我读到了一篇文章,解答了所有的疑问。而且,我发现原来的理解是错的,字节序其实很简单。
3.
首先,为什么会有小端字节序?
答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。
4.
计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节。
如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序正好相反。
理解这一点,才能理解计算机如何处理字节序。
5.
字节序的处理,就是一句话:
"只有读取的时候,才必须区分字节序,其他情况都不用考虑。"
处理器读取外部数据的时候,必须知道数据的字节序,将其转成正确的值。然后,就正常使用这个值,完全不用再考虑字节序。
即使是向外部设备写入数据,也不用考虑字节序,正常写入一个值即可。外部设备会自己处理字节序的问题。
6.
字节序转换的例子
不同cpu平台上字节序通常也不一样,下面写个简单的C程序,它可以测试不同平台上的字节序。
1 | #include <stdio.h> |
2 | #include <netinet/in.h> |
3 | int main() |
4 | { |
5 | int i_num = 0x12345678; |
6 | printf("[0]:0x%x\n", *((char *)&i_num + 0)); |
7 | printf("[1]:0x%x\n", *((char *)&i_num + 1)); |
8 | printf("[2]:0x%x\n", *((char *)&i_num + 2)); |
9 | printf("[3]:0x%x\n", *((char *)&i_num + 3)); |
10 | |
11 | i_num = htonl(i_num); |
12 | printf("[0]:0x%x\n", *((char *)&i_num + 0)); |
13 | printf("[1]:0x%x\n", *((char *)&i_num + 1)); |
14 | printf("[2]:0x%x\n", *((char *)&i_num + 2)); |
15 | printf("[3]:0x%x\n", *((char *)&i_num + 3)); |
16 | |
17 | return 0; |
18 | } |
在80X86CPU平台上,执行该程序得到如下结果:
[0]:0x78
[1]:0x56
[2]:0x34
[3]:0x12
[0]:0x12
[1]:0x34
[2]:0x56
[3]:0x78
分析结果,在80X86平台上,系统将多字节中的低位存储在变量起始地址,使用小端法。htonl将i_num转换成网络字节序,可见网络字节序是大端法。
【转】理解字节序 大端字节序和小端字节序相关推荐
- 计算机网络——网络字节序(大端字节序(Big Endian)\小端字节序(Little Endian))
网络字节序 网络字节序 1.网络字节序 (Network Byte Order)和本机转换 2.字节序转换函数 网络字节序 1.网络字节序 (Network Byte Order)和本机转换 1.大端 ...
- 大端字节序和小端字节序
大端字节序和小端字节序 1.什么是大小端字节序 2.验证大小端字节序 1.什么是大小端字节序 计算机硬件有两种储存数据的方式:大端字节序(MSB)和 小端字节序(LSB). 小端字节序(LSB) 将这 ...
- java 大端字节序_理解字节序 大端字节序和小端字节序
以下内容参考了 http://www.ruanyifeng.com/blog/2016/11/byte-order.html https://blog.csdn.net/yishengzhiai005 ...
- 大端字节序与小端字节序的转换
逐步加深对字节操作的理解,记录一下大端字节序与小端字节序的转换,开发环境是vs2010,项目类型是控制台输出程序,下面是代码实现: // ByteOrder_demo.cpp : 定义控制台应用程序的 ...
- 字节序、大端字节序(Big Endian)、小端字节序(Little Endian)总结
什么是字节序? 字节序,简单来说,指的是 超过一个字节的数据类型在内存中存储的顺序 有几种字节序? 大端字节序(Big Endian) 高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处. ...
- 小端字节序与大端字节序
端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long型数据0x12345678 0x0029f458 0x78 0x0 ...
- 如何确定CPU是大端字节序还是小端字节序?
大端字节序:高字节存放在低地址,低字节存放在高低址 小端字节序:低字节存放在高低址,高字节存放在低地址 大小端字节顺序它是CPU的属性,所哟不同的CPU的大小端字节顺序也不同,移植的时候需要先判断当前 ...
- 小端字节序和大端字节序
端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 需要注意的是,对于数据来说,高字节是指最高位字节,即左边第一位! 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long ...
- 大端字节序小端字节序(网络字节序主机字节序)
大端字节序:整数的高位字节存储在内存的低地址处,低字节存储在内存的高地址处. 小端字节序:整数的高位字节存储在内存的高地址处,低字节存储在内存的低地址处. 一般pc大多采用小端字节序,也称为主机字节序 ...
最新文章
- Oracle增加修改删除字段/主键
- 修改$_env php,Laravel如何友好的修改.env配置文件详解
- 【数据分析】年纪轻轻却突然猝死?数据分析告诉你“猝死”离我们到底有多近?...
- Linux虚拟地址空间布局以及进程栈和线程栈总结
- c# async/await编程
- 6个您需要了解的日志管理工具(以及如何使用它们)
- Javascript:结合canvas、a标签根据url下载图片到本地
- 程序员从入门到放弃,书籍推荐
- oracle12c不使用cdb模式,Oracle 12c 使用Non-CDB来创建PDB
- 功能测试————Siri
- 晶振与晶体的参数详细介绍
- VS2013使用教程总结(3)---修改VA的注释
- 一键解锁iPhone屏幕密码
- 微信多开软件苹果版_微信最新PC版 无限多开以及消息防撤回
- 机器学习笔记(一) KNN K-最近邻
- 信息技术优质课评价标准
- ad被锁定的账户_【原创】解决AD账户被莫名其妙的锁定问题
- 电商Banner设计背后的12个人性的秘密
- 云师大的计算机师范专业好吗,云南除了云南师范大学,还有这些实力不错的师范学校...
- HR面试题(史上最全、持续更新、吐血推荐)
热门文章
- MapReduce计数器
- [ubuntu setting]Change system language
- 但行好事,莫问前程!
- PhoneUtils
- [Silverlight]16进制颜色转ARGB及Color转Int32
- 使用MvcContrib的FormHelper
- 公司间交易学习笔记---概述
- NLG模块实现(未完成)
- [算法][算法复杂度]常用算法复杂度速查表
- 用类来实现输入输出时间,定义多个类对象分别输入输出各对象的时间(时:分:秒),使用函数,数据成员不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数