答案是,涉及不到,可以直接转化。
byte 是 int8,只占用一个字节,而 int 是四个字节。大小端本质是字节序的问题,而 byte 只有一个字节,那就不存在顺序,当然也就不存在大小端的问题。
反过来思考,那 int 转 byte 涉及到大小端问题吗?当然是涉及的,看个简单的例子。
package main import ( "fmt" func main() { s := int32(0x12345678) b := byte(s) fmt.Printf("0x%x\n", b)
执行结果为 0x78,即低位放在了低地址,这就代表我的机器是小端模式,而大端模式与之相反,即低位在高地址。
个人理解,小端模式给我的感觉是正常的,毕竟阶段从低位开始截断看起比较正常。如果 int32 截断后,获取到如果是高位,获得了 0x12,挺奇怪的。
平时工作中,我们不用关心大小端的问题,主要是在网络传输的时候需要注意。当然,类型转化也要注意。网络传输规定了统一的字节序,一般情况下都是大端模式。如果都按各自系统的默认模式,那真是乱套喽。
关于字节序的处理,Go 中提供了包 encoding/binary,其中提供了按大小端转化的方法函数。
一些例子如下:
package main import ( "encoding/binary" "fmt" func main() { bytes := []byte{0x78, 0x56, 0x34, 0x12} fmt.Printf("0x%x\n", binary.LittleEndian.Uint32(bytes)) fmt.Printf("0x%x\n", binary.BigEndian.Uint32(bytes))
按小端模式转化 []byte 变量,则 0x78 在低位,结果为 0x12345678,大端模式结果为 0x78563412。
Go 的 encoding/binary 中定义了一个名为 ByteOrder 的 interface,大小端两种模式都实现了接口的方法。定义如下:
type ByteOrder interface { Uint16([]byte) uint16 // byte[] 转化为 uint16 Uint32([]byte) uint32 // byte[] 转化为 uint32 Uint64([]byte) uint64 // byte[] 转化为 uint64