基础概念——何为大小端

摘要:
首先,无论使用大端方法还是小端方法进行存储,计算机都会将数据从低地址存储到高地址。不同之处在于,低字节数据存储在低地址中,或者高字节数据存储于低地址中。IBM 370主机,大部分基于RISC计算机,摩托罗拉微处理器使用双端法。TCP/IP还使用bigendian方法。因为我们的语言是从左到右的,所以我们希望以相同的方式存储字符和数字。

首先不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址。

若首先取高字节的数据存放在低地址,则是大端法;

若首先取低字节的数据存放在低地址,则是小端法;

 

例如有数据0x01234567 (注意:左边是高字节,右边是低字节)

大端法存放

存放的地址依次为:0x0001 0x0002 0x0003 0x0004

对应的数据依次为:0x01   0x23   0x45   0x67

 



小端法存放

存放的地址依次为:0x0001 0x0002 0x0003 0x0004

对应的数据依次为:0x67    0x45   0x23   0x01

因为我们的思维习惯是从左到右的顺序所以大端法的存储方式符号我们思维习惯,这因为这个原因,大端法也称为网络编码。IBM的370主机,多数基于RISC计算机,和Motorola的微处理器使用big endian方法。TCP/IP也使用big endian方法(big endian方法也叫做网络编码)。因为我们的语言都是从左到右的习惯方式,所以我们希望存储字符和数字也以同样的方式出现。



数据 0x12345678 其中12是数据的高位字节,78是数据的低位字节;

内存地址 小端 大端
0x4000 0x78 0x12
0x4001 0x56 0x34
0x4002 0x34 0x56
0x4003 0x12 0x78

其实理解成高尾端和低尾端比较好;

大、小就是指开头的的数据是高位还是低位;
大端可以理解成数据的高位在内存地址的开头;
小端可以理解成数据的低位在内存地址的开头;



由于网络协议中规定字节序列都采用大端法;(网络字节序列

但是CPU中字节序列由于厂商不同,有可能是大端法,也有可能是小端法;(主机字节序列

这就需要进行大小端的转换;

ntohl()函数是将一个无符号长整型数从网络字节顺序转换为主机字节顺序,
同理:
htonl()函数是将长整型数从主机字节顺序转成网络字节顺序;



相关链接:

大端法还是小端法区别:https://blog.csdn.net/chudongfang2015/article/details/51305458

有关于主机字节序和网络字节序是大端字节序还是小端字节序的问题的探讨:https://blog.csdn.net/weixin_42096901/article/details/95983729

主机字节序列和网络字节序列https://blog.csdn.net/Victor_psl/article/details/104922063

免责声明:文章转载自《基础概念——何为大小端》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇YAML书写规则与数据结构js给dropdownlist添加选项下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

字节序转换详解

在跨平台和网络编程中我们经常会提到网络字节序和主机字节序,如果没有正确对两者进行转换,从而导致两方产生了不同的解释,就会出现意想不到的bug。 目录0x01 概念 0x02 分类 0x03 两种字节序之间的区别 0x01 概念字节序,就是大于一个字节类型的数据在内存中的存放顺序。 注:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型...

搞懂iobuffer就得先学习bytebuffer

ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。 《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。 概述 ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则...

大端法、小端法、网络字节序

关于字节序(大端法、小端法)的定义 《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。   也可以说:  1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。  2....

几种编码方式

这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:问题一:使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?...

Unicode 字符集与它的编码方式

正式内容開始之前,我们先来了解一个基本概念,编码字符集。 编码字符集:编码字符集是一个字符集,它为每个字符分配一个唯一数字。Unicode 标准的核心是一个编码字符集,字母“A”的编码为 004116 和字符“”的编码为 20AC16。Unicode 标准始终使用十六进制数字,并且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。...

TLV(类型—长度—值)格式及编码

转自:http://www.cnblogs.com/tml839720759/archive/2014/07/13/3841820.html 引子:   前段时间在项目中第一次接触TLV,项目中用这种格式来传输图片,语音等。 关于TLV   TLV是一种可变的格式,意为:Type类型, Lenght长度,Value值。Type:该字段是关于标签和编码格式的...