字节序
常见的字节顺序有两种:
Big Endian(High-byte first)和Litter Endian(Low-byte first),当然还有其他字节顺序,但不常见,例如Middle Endian。
小端Little Endian:
低字节存放在低地址,低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
大端Big Endian:
高字节存放在低地址,即高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
大小端一般是由CPU架构决定,常见的Intel、AMD的CPU使用的是小端字节序,而PowerPC使用的是大端字节序,有些ARM处理器还可以选择用大端还是小端模式,具体请自行查阅。
c#
中,字节序跟编译平台所在的CPU相关,例如在Intel x86 CPU架构的windows平台中,c#采用的小端序。
而Java
由于其JVM屏蔽了不同CPU架构导致的字节序差异,所以默认采用大端字节序。
所以,大小端模式是由CPU决定,而编译器又可能会改变这种模式。
网络字节序(Network Order):
TCP/IP各层协议将字节序定义为Big Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
主机字节序(Host Order):
整数在内存中保存的顺序。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序列和网络序(Big Endian)的转换。
在Unicode编码中有一个叫做ZERO WIDTH NO-BREAK SPACE
的字符,它的编码是FEFF
。UCS(Unicode的学名)规范建议我们在传输字节流前,先传输字符ZERO WIDTH NO-BREAK SPACE
。
这样我们根据收到字节FF
和FE
的先后关系,就知道怎么解释接下来的字节流先后关系了。