猿问

如何检索整数常量的字节?

string(42)将整数常量转换42为长度为 1 的字节数组,其中数组的第一个元素具有00101010


package main


import "fmt"


func main() {

    s := string(42)

    fmt.Printf("%d\n", len(s)) // 1

    fmt.Printf("%b\n", s[0]) // 101010 looks good

}

但,


下面的代码采用有效的整数常量,


package main


import "fmt"


func main() {

    s := string(1024)

    fmt.Printf("%d\n", len(s)) // 2


    fmt.Printf("%b %b\n", s[0], s[1]) // 11010000 10000000 this looks wrong representation, it should be 00000100 00000000

}

下面的代码采用有效的整数常量,


package main


import "fmt"


func main() {

    s := string(4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544)

    fmt.Printf("%d\n", len(s))

    fmt.Printf("%d %d %d", s[0], s[1], s[2])

}

并将其转换为大小为 3 的字节数组。239 191 189


但这不是这个整数常量的正确表示。它应该超过 3 个字节。


如何检索给定整数常量的字节?


慕雪6442864
浏览 123回答 2
2回答

吃鸡游戏

主要问题是基本数字类型无法处理这么大的数字。事实上,如果你只是尝试这样的事情:x := 4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544构建将失败:42543...5544 overflows int要做你正在寻找的东西,你需要做两件事:将您的常量存储为可以处理此大小的东西使用可以处理大量数字的数据类型最简单的方法是第一个使用 string ,第二个使用big.Int:package mainimport (    "fmt"    "math/big")func main() {    largeNum := "4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544"    i, ok := big.NewInt(0).SetString(largeNum, 10)    if !ok {        panic("big.Int SetString failed")    }    fmt.Println(i)    fmt.Println(i.Bytes())}这将输出 big int 的base 10 字符串表示(与您输入的相同)和 big endian 字节顺序的字节:4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544[81 58 216 146 57 48 179 246 202 93 83 128 121 181 65 161 52 211 183 127 131 99 227 65 100 227 35 171 8 45 246 240 131 6 183 2 149 204 10 62 88 195 78 51 233 238 225 162 144 75 54 210 134 17 37 22 20 217 213 213 67 96 62 184]

冉冉说

其他答案很好,但我想添加更多关于为什么会发生这种情况的上下文。当您向 提供一个数字时string(),Go 会将输入解释 为 Unicode 代码点。通常你会给出如下的十六进制输入:package mainimport "fmt"func main() {    { // example 1       s := string(0x1F600)       t := fmt.Sprintf("%X", s)       fmt.Println(t == "F09F9880")    }    { // example 2       s := string(0x10FFFF + 1)       t := fmt.Sprintf("%X", s)       fmt.Println(t == "EFBFBD")    }}UTF-8在十进制的 U+10FFFF、 AKA 0x10FFFF、 AKA处达到最大值。1114111因此,如果您为此付出任何代价(显然您已经这样做了),那么您就会EFBFBD 回来,即REPLACEMENT CHARACTER (U+FFFD)。
随时随地看视频慕课网APP

相关分类

Go
我要回答