计算机存储的二进制分为大端序、小端序,
- 大端序:高位内存存在低字节,低位内存存储高字节
- 小端序:高位内存存储高字节,低位内存存储低字节
比如0x12345678,不同字节序模式下如下:
大端序跟人平时读写顺序一致,网络中传输的数据包也是大端序,比如下面的一张网络抓包中的80端口号就对应0x0050。
而计算机内存中的字节序跟机器有关,可能是大端序、也可能是小端序,如何判断到底是哪种字节序?以一段简单的golang代码示例:
package main
import (
"fmt"
"unsafe"
)
func main(){
a := 0x1234
pa := unsafe.Pointer(&a)
//如果低字节是0x34,说明是小端序
if *(*byte)(pa) == 0x34 {
fmt.Println("小端序")
}else {
fmt.Println("大端序")
}
}
如果计算机内存中存储采用的是小端序,那么对于收到的网络包,就需要进行字节序转换。在网络编程中,一般系统都提供有htons、ntohs、ntohl、htonl等几个接口进行2字节、4字节数据的字节序转换。