为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕雪6442864 2022-07-04 16:10:41
string(42)将整数常量转换42为长度为 1 的字节数组,其中数组的第一个元素具有00101010package mainimport "fmt"func main() {    s := string(42)    fmt.Printf("%d\n", len(s)) // 1    fmt.Printf("%b\n", s[0]) // 101010 looks good}但,下面的代码采用有效的整数常量,package mainimport "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 mainimport "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 个字节。如何检索给定整数常量的字节?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

主要问题是基本数字类型无法处理这么大的数字。事实上,如果你只是尝试这样的事情:

x := 4254353345467546745674564564567445674658647567567853467867568756756785786785676858878978978978978907978977896789676786789655289890980889098835432453455544

构建将失败:42543...5544 overflows int

要做你正在寻找的东西,你需要做两件事:

  • 将您的常量存储为可以处理此大小的东西

  • 使用可以处理大量数字的数据类型

最简单的方法是第一个使用 string ,第二个使用big.Int

package main


import (

    "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]


查看完整回答
反对 回复 2022-07-04
?
冉冉说

TA贡献1877条经验 获得超1个赞

其他答案很好,但我想添加更多关于为什么会发生这种情况的上下文。当您向 提供一个数字时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)


查看完整回答
反对 回复 2022-07-04
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信