gpt4 book ai didi

string - fmt.Sscanf无法正确读取十六进制

转载 作者:行者123 更新时间:2023-12-01 20:23:12 26 4
gpt4 key购买 nike

我在读回序列化为十六进制格式的值时遇到麻烦。当我格式化整数时,以下代码产生的值为0x14。但是,当我尝试从字符串中读回该值时,会得到无效的结果。有人可以帮我弄清楚我在做什么吗?

我有一个预先存在的文本文件,正在使用包含这种格式的多行进行解析,因此序列化为其他格式将不是可行的解决方案。我需要使用这种特定格式。

根据go docs,这应该有效:https://golang.org/pkg/fmt/

The verbs behave analogously to those of Printf. For example, %x will scan an integer as a hexadecimal number, and %v will scan the default representation format for the value. The Printf verbs %p and %T and the flags # and + are not implemented. For floating-point and complex values, all valid formatting verbs (%b %e %E %f %F %g %G %x %X and %v) are equivalent and accept both decimal and hexadecimal notation (for example: "2.3e+7", "0x4.5p-8") and digit-separating underscores (for example: "3.14159_26535_89793").


package main

import (
"fmt"
)

func main() {
encode := 20
fmt.Println(fmt.Sprintf("%#x", encode)) // 0x14

var decode int
numRead, err := fmt.Sscanf("0x14", "%#x", &decode)
fmt.Println(decode, numRead, err) // 0 1 bad verb '%#' for integer

numRead, err = fmt.Sscanf("0x14", "%x", &decode)
fmt.Println(decode, numRead, err) // 0 1 nil
}

最佳答案

%x动词将扫描十六进制整数,但不扫描0x前缀。您可以将该前缀添加到格式字符串中:

var decode int
numRead, err := fmt.Sscanf("0x14", "0x%x", &decode)
fmt.Println(decode, numRead, err)

这将把 0x14输入正确扫描为 20的十进制整数值(在 Go Playground上尝试):
20 1 <nil>

另一种选择是使用 %v动词,该动词处理前缀并检测到它是十六进制数字:
var decode int
numRead, err := fmt.Sscanf("0x14", "%v", &decode)
fmt.Println(decode, numRead, err) // Outputs: 20 <nil>

这输出相同。在 Go Playground上尝试这个。这样具有灵活性,可以用多个基数指定输入,可以从前缀中检测到基数(“%v将扫描默认表示格式的值”),例如 0x表示十六进制, 0表示八进制, 0b二进制。

您还可以使用 strconv.ParseInt() ,您可以在其中指定 base == 0,在这种情况下,“前缀由字符串的前缀表示:以2为底的“0b”,以8为底的“0”或“0o”,以16为底的“0x”,并以10为底数”。
decode, err := strconv.ParseInt("0x14", 0, 64)
fmt.Println(decode, err)

Go Playground上尝试这个。

关于string - fmt.Sscanf无法正确读取十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com