持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
1.大小端:
最常见的有两种:
1.Little endian:将低位(序)字节存储在起始地址
2.Big endian:将高位(序)字节存储在起始地址
LE little-endian(小端)
- 最符合人的思维的字节序;
- 地址低位存储值的低位;
- 地址高位存储值的高位;
- 怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说;
- 低位值小,就应该放在内存地址小的地方,也即内存地址低位;
- 反之,高位值就应该放在内存地址大的地方,也即内存地址高位;
BE big-endian(大端)
- 最直观的字节序;
- 地址低位存储值的高位;
- 地址高位存储值的低位;
- 为什么说直观,不要考虑对应关系;
- 只需要把内存地址从左到右按照由低到高的顺序写出;
- 把值按照通常的高位到低位的顺序写出;
- 两者对照,一个字节一个字节的填充进去;
例子:
/*
例子:
对于 32位整型数据 0x12345678, 它在大端和小端两种模式下是这样存储的:
对于0x12345678:
0x12是这个多字节的高位或高序
0x78则是转给多字节的地位或低序
低地址(可看作起始地址) ---------> 高地址
小端: 0x78 0x56 0x34 0x12
大端: 0x12 0x34 0x56 0x78
*/
2.主机字节序:
不同的主机有不同的字节序, 如 x86为小端模式, Motorla 6800为大端模式
3.网络字节序:
TCP/IP中规定好的一种数据表示格式, 它与具体的 CPU类型操作系统等无关, 从而保证数据在不同主机之间传输时能够被正确解释
网络字节序规定, 收到的第一个字节被当作高位看待, 这就要求发送端发送的第一个字节应当是高位。 而在发送端发送数据时, 发送的第一个字节是该数据在内存中起始地址对应的字节
可见网络字节顺序采用 big endian(大端)排序方式
4.字节序的转换
只有在多字节数据处理时才需要考虑字节序;
运行在同一台计算机上的进程相互通信时,一般不用考虑字节序;
异构计算机之间通讯, 需要转换自己的字节序为网络字节序
5.优劣
大端小端没有谁优谁劣,各自优势便是对方劣势:
对于0x12345678的存储
- 小端: 0x78 0x56 0x34 0x12
- 大端: 0x12 0x34 0x56 0x78
小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。 大端模式 :符号位的判定固定为第一个字节,容易判断正负。
6.常见的大小端举例
一般操作系统都是小端,而通讯协议是大端的。
4.1 常见CPU的字节序
Big Endian : PowerPC、IBM、Sun Little Endian : x86、DEC ARM既可以工作在大端模式,也可以工作在小端模式。
4.2 常见文件的字节序
Adobe PS – Big Endian BMP – Little Endian DXF(AutoCAD) – Variable GIF – Little Endian JPEG – Big Endian MacPaint – Big Endian RTF – Little Endian
另外,Java和所有的网络通讯协议都是使用Big-Endian的编码。