登录
首页 >  Golang >  Go问答

Go标准库与字节顺序的疑问

来源:stackoverflow

时间:2024-02-14 10:12:26 141浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Go标准库与字节顺序的疑问》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我们有 num 0x1234

in bigendian:
low address -----------------> high address
0x12  |  0x34
in littleendian:
low address -----------------> high address
0x34  |  0x12

我们可以在binary.go中看到下面的函数:

func (bigendian) putuint16(b []byte, v uint16) {
    _ = b[1] // early bounds check to guarantee safety of writes below
    b[0] = byte(v >> 8)
    b[1] = byte(v)
}

我下载了 x86powpc arch 的 golang 代码,并找到相同的定义。

https://golang.org/dl/
go1.12.7.linux-ppc64le.tar.gz   archive linux   ppc64le 99mb    8eda20600d90247efbfa70d116d80056e11192d62592240975b2a8c53caa5bf3

现在让我们看看这个函数会发生什么。

如果 cpu 是小端字节序,我们将 0x1234 存储在内存中,如下所示:

low address -----------------> high address

0x34  |  0x12

v >> 8 means shift 8 bits right, means /2^8, so we get this in memory:

low address -----------------> high address

0x12  |  0x00



byte(v>>8), we get byte 0x12 which is in low address -> b[0]

byte(v), we get byte 0x34 -> b[1]

所以我们得到了我认为正确的结果: [0x12,0x34]

======================================== 如果 cpu 是大端字节序,我们将 0x1234 存储在内存中,如下所示:

low address -----------------> high address

0x12  |  0x34

v >> 8 means shift 8 bits right, means /2^8, so we get this in memory:

low address -----------------> high address

0x00  |  0x12

byte(v>>8), we get byte 0x00 which is in low address -> b[0]

byte(v), we get byte 0x12 -> b[1]

所以我们得到了我认为不正确的结果: [0x00,0x12]

我在网上找到了如何检查您的 cpu bigendian 或小端,我在下面编写了函数:

func IsBigEndian() bool {
    test16 := uint16(0x1234)
    test8 := *(*uint8)(unsafe.Pointer(&test16))
    if test8 == 0x12{
        return true
    }else{
        fmt.Printf("little")
        return false
    }
}

根据这个函数,我认为byte()意味着获取低地址字节,对吗?

如果正确,为什么我在分析“if cpu is big endian ...”时得到错误的结果?


解决方案


非常感谢@Volker,我找到了这篇文章 Does bit-shift depend on endianness? 。并且知道“byte(xxx)”在处理器的寄存器中操作,不依赖于内存中的字节顺序,因此byte(0x1234)总是得到0x34。

理论要掌握,实操不能落!以上关于《Go标准库与字节顺序的疑问》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>