大端(Big Endian)/小端(Little Endian)字节序

时间:2019-12-08
本文章向大家介绍大端(Big Endian)/小端(Little Endian)字节序,主要包括大端(Big Endian)/小端(Little Endian)字节序使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

大端(Big Endian)/小端(Little Endian)字节序

参考文章:

大端字节序 与 小端字节序

在计算机中存在这样一个问题:如何表示各种各样的数据?

对于图片等文件来说,有固定的格式文档参考。

而对于整数来说,计算机应该如何表示?

它的定义一定包括整数的大小、是否带符号以及符号是什么、使用什么编码格式表示(一般都是二进制补码),还有很重要的一点:字节顺序

字节应该从右向左读还是从左向右读呢?

这种读取的顺序就称为:字节序(Byte-order / Endianness)

字节序分为两种:大端字节序(Big Endian,从左向右)和小端字节序(Big Endian,从右向左)

换句话说

大端字节序高位字节在前,低位字节在后

小端字节序低位字节在前,高位字节在后

从一个十六进制数字0x1234开始:

大端字节序

大端字节序是人类处理自然语言的做法,符合人类从左向右读的阅读习惯。

在这种规范下,十六进制数会先存储0x12作为高字节,接下来存储0x34。

小端字节序

低位字节在前,高位字节在后,也就是会以0x3412的形式存储。

注意!

字节序是以字节为单位定义的,在一个字节中,两个半字节仍然是以大端的形式存在。

疑问?

为什么要区分字节序?这样复杂的意义是什么?

小端字节序的意义

小端字节序对于逻辑电路更有效率。逻辑电路先处理低位字节更有效率,因为计算都是从低位开始的,计算机中的内部处理逻辑都是使用小端字节序。

但是,大多数的网络协议和文件格式都是大端字节序,这样对用户更加友好。

既然有区分,在使用时肯定要使用一定的解析规则,下面进行简要介绍。

字节序的处理

对于大端字节序,计算机先读到的是高位字节,后读到的是低位字节。而小端字节序恰好相反。

字节序的处理:只有在读取的时候才需要区分字节序,其他情况都不需要处理。

处理器读取外部数据时,必须知道数据的字节序才可以将其转化成正确的值。接下来就可以正常使用这个值,不需要再考虑字节序。而向外部设备写数据的时候,也不需要考虑字节序,正常写入一个值即可,外部设备会自己处理字节序的问题。

例如,处理器读入一个16位整数

大端字节序会按照如下方法转值:

x = buf[offset] * 256 + buf[offset+1];

其中buf是整个数据块在内存中的起始地址,offset表示偏移量,也就是正在读取的位置。第一个字节乘以256,再加上第二个字节,就是大端字节序的值,这个式子可以用逻辑运算符改写。即:

x = buf[offset]<<8 | buf[offset+1];

编译器总是将乘2的幂转换成移位指令,这样更加方便!左移八位,即在后面添加8个0。

小端字节序会按照如下方法转值:

x = buf[offset+1] * 256 + buf[offset];

32位整数的求值公式也是一样的

/* 大端字节序 */
i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

/* 小端字节序 */
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

原文地址:https://www.cnblogs.com/folm/p/12004711.html