golang中byte转int涉及到大小端问题吗?

可以直接使用int(byte_var)强制转换吗?
关注者
4
被浏览
8,009
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

答案是,涉及不到,可以直接转化。

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