字节序(大端&小端)

字节序(大端&小端)

一、功能

计算机硬件的数据存储方式有两种:大端字节序(big endian)和小端字节序(little endian)。

二、产生原因

存在两种字节序的原因:

  • 大端字节序:方便人类读写习惯,因此可以用来网络传输和文件存储。
  • 小端字节序:计算机从低地址开始读取,从低位字节开始计算,因此小端字节序便于计算机做运算处理。

三、定义

  • 大端字节序:高位字节保存在内存的低地址

  • 小端字节序:高位字节保存在内存的高地址

    0x1234567的大端字节序和小端字节序的写法如下图:
    在这里插入图片描述

四、使用

1、字节序判断

  • 判断的时机

    只有读取的时候,才需要区分字节序。

    CPU读取外部数据的时候,必须知道数据字节序,之后才能将数据转化成正确的值。读取到正确值后使用即可,不用再考虑字节序。在向外部设备写入数据,也不用区分字节序(注意,写的时候不是不用设置字节序,只是不用判断实际使用的是那种字节序,按照存储着自己想要的方式即可),外部设备自己处理字节序问题。即,谁读取(也即谁使用),谁区分

  • 判断的方式

    Unicode编码规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做“零宽度非换行空格”(Zero Width No-Break Space),它的编码是FEFF,在UCS中是不存在的字符。UCS规范建议我们在传输字节流前,先传输字符"Zero Width No-Break Space",这正好是2个字节,而且FF比FE大1。如果一个文本文件的头2个字节是FE FF,就表示该文件采用大头方式;如果头2个字节是FF FE,就表示该文件采用小头方式。字符"Zero Width No-Break Space"又被称作BOM(Byte Order Mark,字节序标记)

2、使用场景

  • 网络传输

    UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节。而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处)。由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的,即网络字节序是大端字节序。比如,我们经过网络发送整型数值0x12345678时,在80X86平台中,它是以小端发存放的,在发送之前需要使用系统提供的字节序转换函数htonl()将其转换成大端法存放的数值。

  • CPU存储

    • Big Endian : PowerPC、IBM、Sun(java虚拟机默认)、ARM
    • Little Endian : x86、DEC、ARM(默认)

参考文献

https://www.zhihu.com/question/20152853/answer/95576659 对于字符编码,程序员的话应该了解它的那些方面?- 知乎

https://www.cnblogs.com/gremount/p/8830707.html 理解字节序 大端字节序和小端字节序 - 博客园

https://baike.baidu.com/item/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/6750542?fr=aladdin 大小端模式 - 百度百科

https://www.cnblogs.com/langzou/p/9010899.html 大端和小端的起源 - 博客园

猜你喜欢

转载自blog.csdn.net/u013617791/article/details/103780217
今日推荐