二进制读写之大端VS小端

字节(Byte)

所谓大端(Big Endian)、小端(Little Endian)是指计算机在读写数据时遵循的字节排列顺序,即字节序(Byte Order)。

想要理解字节序,必须得先了解字节
计算机CPU运行任何程序,处理任何事物,都是在执行一段由0、1组成的二进制机器指令;也就说计算机只认识0和1;每个0和1都被分别放到一个bit位上,bit:计算机世界里表示信息的最小单位。

例如,整数15,二进制为1111, 要用4个二进制bit位表示;整数200,二进制为11001000,要用8个二进制bit位表示。

计算机中所有人文符号,比如数字,符号,图片等都是由数字去表示的;要表示的数据越大,所用到的数字也就越多;如果利用bit位去表示一个数据占用,会发现即长又不方便记忆。
因为早期计算机需要表示的字符不是很多,只有0-9阿拉伯数字,英文字母,标点符号等;字符的Unicode编码,用8个二进制bit位就能全部标识;8个二进制bit位长度被称之为字节(Byte);即1Byte=8bit

Byte是计算机存储数据的最小单位。

字节序/端 (Endian)

大端**(Big Endian)** :是指低地址存放,最高有效字节(MSB)。
小端**(Little Endian)** :是低地址存放,最低有效字节(LSB)。

二进制读写之大端VS小端_第1张图片

例如:
整数:573785173
二进制:100010001100110100010001010101
16进制:0x22334455
占用:4个字节(Byte)
占用计算:因为1个16进制位,能标识的最大数是F(十进制15),二进制为1111,占用4个bit,2个16进制位就是8bit,刚好是一个字节(Byte)

0x:十六进制表示符,看到0x就表示这是一个16进制数。

整数573785173,大/小端字节序,体现在存储上就是下面这种情况:

假设存储地址: 0x0155a800->00000000 0x0155a801->00000000 0x0155a802->00000000 0x0155a803->00000000
Big Endian法: 0x22=>00100010 0x33=>00110011 0x44=>01000100 0x55=>01010101
Little Endian: 0x55=>01010101 0x44=>01000100 0x33=>00110011 0x22=>00100010

0x0155a800->00000000 :表示在0x0155a800这个地址上有8bit,1字节(Byte)的存储空间。
0x22=>00100010 : 用十六进制数表示一个具体的二进制存储结果,存储地址上具体存的是一个二进制数。

  • Windos(x86,x64)和Linux(x86,x64)都是Little Endian操作系统。
  • 在ARM上,我见到的都是用Little Endian方式存储数据。
  • C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的。
  • JAVA编写的程序则唯一采用Big Endian方式来存储数据。
  • 所有网络协议也都是采用Big Endian的方式来传输数据的。所以有时我们也会把Big Endian方式称之为网络字节序。

两个系统中使用了不同字节序,读取数据,A用大端向B发送数据,B收到数据用小端去读取,不做转换的话数据无法正常解析。

你可能感兴趣的:(操作系统,网络协议)