String fmt.Sscanf无法正确读取十六进制
我无法读回已序列化为十六进制格式的值。当我格式化一个整数时,下面的代码生成一个值0x14。但是,当我试图从字符串中读回该值时,会得到无效的结果。有人能帮我找出我做错了什么吗 我有预先存在的文本文件,我正在用包含此格式的多行解析这些文本文件,因此序列化为其他格式将不是一个可行的解决方案。我需要使用这种特定的格式 根据go文档,这应该是可行的: 这些动词的行为与Printf相似。例如,%x将扫描一个十六进制数形式的整数,%v将扫描该值的默认表示格式。Printf谓词%p和%T以及标志和+未实现。对于浮点值和复数值,所有有效的格式化谓词%b%e%e%f%f%g%g%x%x和%v都是等效的,并且接受十进制和十六进制表示法,例如:2.3e+7、0x4.5p-8和数字分隔下划线,例如:3.14159_26535_89793String fmt.Sscanf无法正确读取十六进制,string,go,hex,scanf,String,Go,Hex,Scanf,我无法读回已序列化为十六进制格式的值。当我格式化一个整数时,下面的代码生成一个值0x14。但是,当我试图从字符串中读回该值时,会得到无效的结果。有人能帮我找出我做错了什么吗 我有预先存在的文本文件,我正在用包含此格式的多行解析这些文本文件,因此序列化为其他格式将不是一个可行的解决方案。我需要使用这种特定的格式 根据go文档,这应该是可行的: 这些动词的行为与Printf相似。例如,%x将扫描一个十六进制数形式的整数,%v将扫描该值的默认表示格式。Printf谓词%p和%T以及标志和+未实现。对于
请注意文档中的这句话: Printf谓词%p和%T以及标志和+未实现 因此:
请注意文档中的这句话: Printf谓词%p和%T以及标志和+未实现 因此: %x谓词将扫描十六进制整数,但不会扫描0x前缀。您可以将该前缀添加到格式字符串中:
var decode int
numRead, err := fmt.Sscanf("0x14", "0x%x", &decode)
fmt.Println(decode, numRead, err)
这将正确地将0x14输入扫描为十进制整数值20,请在以下位置尝试:
这输出相同的结果。试一试这个。这具有灵活性,可以在多个基址中指定输入,将从前缀%v中检测基址,并扫描默认表示格式中的值,例如0x表示六进制,0表示八进制,0b表示二进制
您还可以使用where来指定base==0,在这种情况下,base由字符串的前缀表示:base 2表示0b,base 8表示0或0o,base 16表示0x,base 10表示其他
请在上尝试此选项。%x谓词将扫描十六进制整数,但不会扫描0x前缀。您可以将该前缀添加到格式字符串中:
var decode int
numRead, err := fmt.Sscanf("0x14", "0x%x", &decode)
fmt.Println(decode, numRead, err)
这将正确地将0x14输入扫描为十进制整数值20,请在以下位置尝试:
这输出相同的结果。试一试这个。这具有灵活性,可以在多个基址中指定输入,将从前缀%v中检测基址,并扫描默认表示格式中的值,例如0x表示六进制,0表示八进制,0b表示二进制
您还可以使用where来指定base==0,在这种情况下,base由字符串的前缀表示:base 2表示0b,base 8表示0或0o,base 16表示0x,base 10表示其他
试试这件衣服。谢谢!我感谢你为提供替代方案所付出的额外努力,我学到了一些新技巧:谢谢!我感谢您为提供替代方案所付出的额外努力,我学到了一些新技巧:啊,我确实读过,但出于某种原因,它没有表明我需要自己在格式字符串中添加0x前缀,因为我无法使用等效格式。谢谢你的假支票!啊,我确实读过,但出于某种原因,它没有表明我需要自己在格式字符串中添加0x前缀,因为我不能使用等效格式。谢谢你的假支票!
var decode int
numRead, err := fmt.Sscanf("0x14", "0x%x", &decode)
fmt.Println(decode, numRead, err)
20 1 <nil>
var decode int
numRead, err := fmt.Sscanf("0x14", "%v", &decode)
fmt.Println(decode, numRead, err) // Outputs: 20 <nil>
decode, err := strconv.ParseInt("0x14", 0, 64)
fmt.Println(decode, err)