背景

主机间(或者同一台机器的两个进程间)的字节序可能不同。

概述

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。
唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。
一般保证数字类型(整数、浮点数)、指针的字节序一致,可参考Redis实现

小端字节序Little endian:将低序字节存储在起始地址(human,地址低位存储值的低位,地址高位存储值的高位),又称主机字节序
大端字节序Big endian:将高序字节存储在起始地址(最直观,把内存地址从左到右按照由低到高的顺序写出把值按照通常的高位到低位的顺序写出)
网络字节序:TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。故大端字节序又称为网络字节序

如双字0x01020304(DWORD)的存储方式,存储地址为4000&4001&4002&4003,则
LE 04 03 02 01
BE 01 02 03 04

socket转换函数
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

常见字节序
IA架构(Intel、AMD)的CPU中是Little endian,而PowerPC 、SPARC和Motorola处理器是Big-Endian。这其实就是所谓的主机字节序。JAVA字节序也是BIG-ENDIAN。网络字节序是BIG-ENDIAN。
x86系列CPU都是little-endian的字节序.
Redis:小端字节序
处理器 操作系统 字节排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <——-x86系统是小端字节序系统
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非NT Big endian <——-PPC系统是大端字节序系统
RS/6000 UNIX Big endian
SPARC UNIX Big endian
IXP1200 ARM核心 全部 Little endian