Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何检索整数常量的字节?_Go_Unicode - Fatal编程技术网

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

Go 如何检索整数常量的字节?,go,unicode,Go,Unicode,string42将整数常量42转换为长度为1的字节数组,其中数组的第一个元素为00101010 但是, 下面的代码采用有效的整数常量 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 10

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

但是,

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

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])
}
下面的代码采用有效的整数常量

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的字节数组。2391189

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


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

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

x:=42543533345467675467546754675456456456755674658647567567853467867568756756785786785676768588789789789797978978978978979797979796767667896552890980889098835432455544 生成将失败:42543…5544溢出int

要实现您的目标,您需要做两件事:

将常数存储为可以处理此大小的值 使用可以处理大量数据的数据类型 最简单的方法是对第一个和第二个使用字符串:

包干管 进口 fmt 数学/大 func main{ 拉格尼姆:=425435333454676754675674567456456456746586475675678534678675687567567857867856768588789789789789788978907978979796787667896552890980889098835432455544 i、 确定:=big.NewInt0.SetStringlargeNum,10 如果!好的{ panicbig.Int设置字符串失败 } 打印格式 fmt.Printlni.Bytes } 这将以大端字节顺序输出输入的同一事物的大整数表示形式和:

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]

另一个答案是好的,但我想补充一点关于为什么会这样的上下文 发生了。当您为字符串提供数字时,Go将解释输入 . 通常,您会给出如下所示的十六进制输入:

package main
import "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最大输出,也就是0x10FFFF,也就是十进制的1114111。所以 如果你在你明显做过的事情上做了什么,那么你得到了EFBFBD
返回,即。

问题中使用的将符文转换为符文的UTF-8表示形式。正如您所观察到的,无效的Unicode代码点被转换为\uFFFD。@MuffinTop 1024是一个整数常量。我认为,string1024考虑将1024作为unicode代码点,并使用UTF-8将unicode代码点编码为11010000 10000000。正确答案是,字节11010000 10000000是Unicode代码点1024的UTF-8表示形式。string42将整数常量42转换为字节数组。否。string42将非类型化常量42转换为字符串。字符串和字节数组在Go中是不同的类型。@thwd:当然可以。常量可以表示数字。它当然会在运行时出现,因为它不适合最大的Go整数类型int64。但是编译器可以获取两个大常量并使其解析,因为编译器为您进行除法,结果符合标准类型。但对原始常量执行任何其他操作,比如将其传递给big.Int,它都会失败。我的评论涵盖了这一点。您的答案仍然有不正确的语句常量数字类型不能代表这么大的数字。来自:数值常量表示任意精度的精确值,不会溢出。足够公平,重新编写。