精华内容
下载资源
问答
  • 大小端字节序

    2021-02-26 21:25:41
    现代CPU计算时一次都能装载多个字节(如32位计算机一次装载4字节),多字节的数值在内存中高低位的排列方式会影响所表示的数值,以int32类型的数值169756310(十六进制表示为:0x0103070f;二进制表示为:0b 00000001 ...

    现代CPU计算时一次都能装载多个字节(如32位计算机一次装载4字节),多字节的数值在内存中高低位的排列方式会影响所表示的数值,以int32类型的数值169756310(十六进制表示为:0x0103070f;二进制表示为:0b 00000001 00000011 00000111 00001111)为例,在内存中用4个字节存储,4个字节的内容分别是0x01(00000001)、0x03(00000011)、0x07(00000111)、0x0f(00001111)。根据字节高低位排序方式的不同,可以分为:大端字节序(big endian)和 小端字节序(little endian)。

    大端字节序

    大端字节序是指一个整数的高位字节(如上例中的0x01)存储在内存的低地址处,可以理解为数值的高位部分靠前存储。以前面的0x0103070f为例,假如存储在内存中的起始地址为0x12345678,则0x0103070f在内存中的存储为:

    地址0x12345678处存储内容为:0x01(00000001)

    地址0x12345679处存储内容为:0x03(00000011)

    地址0x1234567a处存储内容为:0x07(00000111)

    地址0x1234567b处存储内容为:0x0f(00001111)

    小端字节序

    和大端字节序相反,小端字节序把数值的低位字节存储在内存的低地址处,即低位部分靠前存储,0x0103070f在内存中的存储为:

    地址0x12345678处存储内容为:0x0f(00001111)

    地址0x12345679处存储内容为:0x07(00000111)

    地址0x1234567a处存储内容为:0x03(00000011)

    地址0x1234567b处存储内容为:0x01(00000001)

    主机字节序

    现代计算机大多采用小端字节序,所以小端字节序又叫主机字节序。

    网络字节序

    不同的计算机可能会采用不同的字节序,甚至同一计算机上不同进程会采用不同的字节序,如JAVA虚拟机采用大端字节序,可能和采用小端字节序计算机上的其他进程不同。所以在网络通信(或进程间通信)时,如果都按自己存储的顺序收发数据,有可能会出现一些『误解』。比如采用大端字节序的进程按自己字节序发数据0x0103070f给一个小端字节序进程,发送的内容为:00000001 00000011 00000111 00001111。采用小端字节序的进程接收到数据后,按照小端字节序的定义,00000001是低位字节内容,00001111是高位字节内容,这样就把0x0103070f理解成了0x0f070301。为了避免这个问题,约定数据在不同计算机之间传递时都采用大端字节序,也叫作网络字节序。通信时,发送方需要把数据转换成网络字节序(大端字节序)之后再发送,接收方再把网络字节序转成自己的字节序。上面大端发给小端的例子,大端发送时不需要做处理,直接按自己的字节序发送,小端方接收时把接收到的数据转换成小端字节序后再使用。

    展开全文
  • 理解大小端字节序

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

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

    什么是字节序?

    字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序

    那么就很明显了,像char这样的类型,肯定不存在字节序的问题了。

    字节序分为哪几类?

    大端字节序:

    高位字节数据存放在低地址处,低位数据存放在高地址处;

    小段字节序:

    高位字节数据存放在高地址处,低位数据存放在低地址处;

    网络字节序:

    TCP/IP协议传输数据时,字节序默认大端。

    其实字节序只有大端字节序和小端字节序两种,网络字节序也是大端,这个以后会说到。关于大小端字节序的重点,上面已经标的很明显了,一个是高低地址,一个是高低位字节,那下面就看看这两个是什么意思?

    重点来了

    首先看什么是高地地址:

    在内存中,栈是向下生长的,以char arr[4]为例,(因为char类型数据只有一个字节,不存在字节序的问题)依次输出每个元素的地址,可以发现,arr[0]的地址最低,arr[3]的地址最高,如图:

    a3414f4affac1305556b9bbd7fa3da09.png

    接下来看什么是高低位:

    给一个十进制整数,123456,很明显左边的是高位,右边的是低位。计算机也是这样认为的。给一个16进制数,0x12345678,以字节为单位,从高位到低位依次是 0x12、0x34、0x56、0x78。

    下来将高地地址和高低位对应。

    一个整形占4个字节,给一个整形数据0x12345678,如果是大端存储,存储格式如下:

    f8fa9de277b7489343cdea8dffe8e9ab.png

    如果是小端存储,存储格式如下:

    90ebbe9d4cf1362eae839a5996c36787.png

    那如何判断当前系统是大端还是小端呢?

    最简单地来说,我们可以用 1 为例,1在栈中存储的大小端格式分别如下图所示,

    6f8485a68ae0c50a567e44d41e6d9e02.png

    如果我们可以得到 1 在内存中存储的第一个字节,那么我们就可以知道当前系统是大端存储还是小端存储了。

    测试代码如下:

    #include

    int main()

    {

    int a = 1;

    char pc = *(char*)(&a);

    if (pc == 1)

    printf("第一个字节为1,小端存储\n");

    else

    printf("第一个字节为0,大端存储\n");

    return 0;

    }

    展开全文
  • 端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序。小端字节序:低字节存于内存低地址;高字节存于内存高地址。如一个long型数据0x123456780x0029f458 0x780x0029f459 0x560x0029f45a 0x340x0029f...

    端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序。

    小端字节序:低字节存于内存低地址;高字节存于内存高地址。如一个long型数据0x12345678

    0x0029f458  0x78

    0x0029f459  0x56

    0x0029f45a  0x34

    0x0029f45b  0x12

    在以上数据存放于内存中的表现形式中,0x0029f458 < 0x0029f459 < 0x0029f45a < 0x0029f45b,

    可以知道内存的地址是由低到高的顺序;而数据的字节也是由低到高的,故以上字节序是小端字节序。

    大端字节序:高字节存于内存低地址;低字节存于内存高地址。

    0x0029f458  0x12

    0x0029f459  0x34

    0x0029f45a  0x56

    0x0029f45b  0x79

    在以上数据存放于内存中的表现形式中,0x0029f458 < 0x0029f459 < 0x0029f45a < 0x0029f45b,

    可以知道内存的地址是由低到高的顺序;而数据的字节却是由高到低的,故以上字节序是大端字节序。

    网络字节序:就是大端字节序。规定不同系统间通信一律采用网络字节序。

    在VC中的实验如下:

    int  temp = 0x12345678;

    调试中,该变量在内存中的字节数据是78 56 34 12,内存中的存放地址是:0x0029f458,0x0029f459,

    0x0029f45a,0x0029f45b;刚好符合低位存于低地址中,说明VC遵循小端字节序。

    展开全文
  • 小端字节序(Little Endian) 高位字节数据存放在内存高地址处,低位数据存放在内存低地址处。 如上图所示,int32类型的数值 12345678用一个字节表示不了,需要用到4个字节,也就有了字节序的问题。 数值 12345678(一...

    什么是字节序?

    字节序,简单来说,指的是 超过一个字节的数据类型在内存中存储的顺序

    有几种字节序?

    大端字节序(Big Endian)

    高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。

    小端字节序(Little Endian)

    高位字节数据存放在内存高地址处,低位数据存放在内存低地址处。

    如上图所示,int32类型的数值 12345678用一个字节表示不了,需要用到4个字节,也就有了字节序的问题。

    数值 12345678(一千两百三十四万五千六百七十八),这里的最高位数据就是1,最低位数据就是8

    看大端序的存储方式,高位在前面的低地址,低位在后面的高地址,这也是人类读写数值的方式;而小端序正好相反。

    那么问题来了,为什么还需要小端序的方式,只使用大端序的方式不是更方便吗?什么是内存高地址/低地址,为什么低地址在前,高地址在后呢?

    为什么需要小端字节序?

    我们知道计算机正常的内存增长方式是从低到高(当然栈不是),取数据方式是从基址根据偏移找到他们的位置。

    从大/小端的存储方式可以看出,大端存储因为第一个字节就是高位,从而很容易知道它是正数还是负数,对于一些数值判断会很迅速。

    而小端存储 第一个字节是它的低位,符号位在最后一个字节,这样在做数值四则运算时,从低位每次取出相应字节运算,最后直到高位,并且最终把符号位刷新,这样的运算方式会更高效。

    所以大端和小端有其各自的优势。

    具体是使用大端序还是小端序跟处理器体系有关:

    处理器体系

    • x86、MOS Technology 6502、Z80、VAX、PDP-11等处理器为小端序;
    • Motorola 6800、Motorola 68000、PowerPC 970、System/370、SPARC(除V9外)等处理器为大端序;
    • ARM、PowerPC(除PowerPC 970外)、DEC Alpha、SPARC V9、MIPS、PA-RISC及IA64的字节序是可配置的。

    字节序的处理

    计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节。

    如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序正好相反。

    网络字节序

    前面的大端和小端都是在说计算机自己,也被称作主机字节序HBO(Host Byte Order)。其实,只要自己能够自圆其说是没啥问题的。问题是,网络的出现使得计算机可以通信了。通信,就意味着相处,相处必须得有共同语言啊,得说普通话,要不然就容易会错意,下了一个小时的小电影发现打不开,理解错误了!

    但是每种计算机体系都有自己的主机字节序啊,还都不依不饶,坚持做自己,怎么办?

    TCP/IP协议隆重出场,RFC1700规定使用“大端”字节序为网络字节序NBO(Network Byte Order)

    其他不使用大端的计算机要注意了,发送数据的时候必须要将自己的主机字节序转换为网络字节序(即“大端”字节序),接收到的数据再转换为自己的主机字节序。这样就与CPU、操作系统无关了,实现了网络通信的标准化。

    为了程序的兼容,你会看到,程序员们每次发送和接受数据都要进行转换,这样做的目的是保证代码在任何计算机上执行时都能达到预期的效果。

    这么常用的操作,BSD Socket提供了封装好的转换接口,方便程序员使用。包括从主机字节序到网络字节序的转换函数:htons、htonl;从网络字节序到主机字节序的转换函数:ntohs、ntohl。当然,有了上面的理论基础,也可以编写自己的转换函数。

    网络字节顺序(NBO)
    NBO(Network Byte Order):按照从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。TCP/IP中规定好的一种数据表示格式,与具体的 CPU 类型、操作系统等无关。从而保证数据在不同主机之间传输时能够被正确解释。

    主机字节顺序(HBO)
    HBO(Host Byte Order):不同机器 HBO 不相同,与 CPU 有关。计算机存储数据有两种字节优先顺序:Big Endian 和 Little Endian。Internet 以 Big Endian 顺序在网络上传输,所以对于在内部是以 Little Endian 方式存储数据的机器,在网络通信时就需要进行转换。

    除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存

    golang中验证系统的大小端

    package main
    
    import (
    	"fmt"
    	"unsafe"
    )
    
    func main() {
    	a := int64(0x12345678)
    	fmt.Printf("int64: %v bytes\n", unsafe.Sizeof(a))
    
    	//用int8去转换int64,会只截取到第一个字节
    	s := int8(a)
    
    	if 0x12 == s {
    		fmt.Println("Big-Endian")
    	} else {
    		fmt.Println("Little-Endian")
    	}
    
    	fmt.Printf("s: 0x%x", s)
    }
    
    输出如下:
    
    int64: 8 bytes
    Little-Endian
    s: 0x78
    

    参考:

    大小端字节序存在的意义,为什么不用一个标准呢?https://www.zhihu.com/question/25311159

    http://www.ruanyifeng.com/blog/2016/11/byte-order.html

    你知道字节序吗 https://zhuanlan.zhihu.com/p/115135603

    “字节序”是个什么鬼? https://zhuanlan.zhihu.com/p/21388517

    字节序及 Go encoding/binary 库 https://zhuanlan.zhihu.com/p/35326716

    字节序:Big Endian 和 Little Endian https://songlee24.github.io/2015/05/02/endianess/

    展开全文
  • 两种存储数据的方式:小端字节序LSB 和大端字节序MSB。 **小端字节序:**低位字节在前,高位字节在后,绝大部分处理器和系统都是小端字节序。 **大端字节序:**高位字节在前,低位字节在后,网络通信采用大端字节序...
  • 大端字节序和小端字节序1.什么是大小端字节序2.验证大小端字节序 1.什么是大小端字节序 计算机硬件有两种储存数据的方式:大端字节序(MSB)和 小端字节序(LSB)。 小端字节序(LSB) 将这样的数据存储在计算机中,...
  • 字节序概念 大端存储模式:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。 小端存储模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。 判断当前机器的字节序 ...
  • 单位为字节。 大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;...小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。 ...
  • 小端字节序存储模式:数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中 大端字节序存储模式:数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中 数据高位-----数据低位 int a=1...
  • vs编译器的小端字节序 证明程序 整形数据的打印 1.%d:以 有符号的形式,打印二进制补码对应的整形 2.%u:以 无符号的形式,打印二进制补码对应的整形 浮点型在内存中的存储 根据国际标准IEEE(电气和电子工程协会) ...
  • 计算机有两种存储数据的方式,大端字节序(Big Endian)和小端字节序(Little Endian)。 1、大端字节序:高位存放在高地址,低位存放在低地址。 2、小端字节序:高位存放在低地址,低位存放在高地址。 对于Int类型的...
  • 3.大小端字节序 4.浮点型数据的存储 ———————————————————————————————————————————— *1.数据的类型 *2.整形数据在内存中的存储 *3.大小端字节序 *4.浮点型数据的存储 ...
  • 在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则...
  • 以下内容参考了http://www.ruanyifeng.com/blog/2016/11/byte-order.htmlhttps://blog.csdn.net/yishengzhiai005/article/details/396725291.计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序...
  • 1、80X86使用小端法,网络字节序使用大端法。2、二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int来处理,unsigned short ,unsigned short 以网络字节序处理后再拷贝到发送的...
  • 大端字序节和端自序节就是我们所说的大端模式和端模式小端字节序就是低地址存储数的低位字节。大端字节序正好相反。举个例子。加入有 int a = 0x01000002;假设变量a在内存的地址为:0x00000001;//这只是为了 ...
  • 小端字节序 : 数据的低位存储在低地址空间, 数据的高位存储在高地址空间. 小端字节序称为LSB 1.3 什么是大端字节序 大端字节序 : 数据的低位存储在高地址空间, 数据的高位存储在低地址空间. 大端字节序称为MSB ...
  • #if defined(__ALPHA) || defined(__alpha) || defined(__alpha__) || defined(_M_ALPHA)#define POCO_ARCH POCO_ARCH_ALPHA#define POCO_ARCH_LITTLE_ENDIAN 1#elif defined(i386) || defined(__i386) || defined(_...
  • 概念: 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 常见的字节序有: Little endian(xiaoduanzijiexu):将低序字节存储在起始地址
  • 字节序是数据的存储方式或者说是顺序,有大端和小端两种格式,本机的字节序只与CPU有关,与操作系统等无关; 为什么会有字节序的概念? 不同的CPU保存数据的格式不同 以0x12345678(假设在内存中存储的起始地址是0x...
  • 大端存储模式:是指数据的低字节保存在内存的高地址中,而数据的高字节保存在内存的低地址中小端存储模式:是指数据的低字节保存在内存的低地址中,而数据的高字节保存在内存的高地址中 举例:已知本机是小端存储...
  • *判断当前PC为大端还是小端字节序 @ 返回值: 1:大端;0:端。 */ int JudgeEndianOfPC() { int num = 1; if (*(char*)&num == 1)//端 return 0; return 1; } 2,改变字节序(大端<--->端互相...
  • 1、什么是大端端 大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;...端(存储)模式,是指数据的低位...如果是小端字节序,则在内存中存储方式为0000 00...
  • 一般机器的字节序大小和比特序大小是一致的。 人类阅读时,从左向右进行阅读,所以先看到数字的高位,最后才能看到数字的低位。所以,人类的阅读顺序,天然是大端顺序。大端顺序是更方便人类阅读和表述的顺序。...
  • 请简述大端字节序和小端字节序的概念,设计一个程序来判断当前机器的字节序。 题目解答 大端为数据的低字节存放在内存中的高地址处; 端为数据的低字节存放在内存中的低地址处。 编程思路:输入一个整数1,16进制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,540
精华内容 23,416
关键字:

小端字节序

友情链接: test-mini.zip