有趣的字节序

252 阅读1分钟

计算机存储的二进制分为大端序、小端序,

  • 大端序:高位内存存在低字节,低位内存存储高字节
  • 小端序:高位内存存储高字节,低位内存存储低字节

比如0x12345678,不同字节序模式下如下: image.png

大端序跟人平时读写顺序一致,网络中传输的数据包也是大端序,比如下面的一张网络抓包中的80端口号就对应0x0050。

image.png

而计算机内存中的字节序跟机器有关,可能是大端序、也可能是小端序,如何判断到底是哪种字节序?以一段简单的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字节数据的字节序转换。