我是新手,我一直在尝试将字符串“ 0x0000”转换为十六进制,到目前为止没有任何运气。这是我尝试过的:
import "strconv"
c, err := strconv.ParseUint("0x0000", 16, 32)
if err != nil {
return err, nil
}
会引发错误:strconv.ParseUint: parsing "0x0000": invalid syntax
。
我也尝试过uint16("0x0000")
,但显然我也无法将字符串直接转换为uint16
。我敢肯定这是微不足道的,所以任何帮助将不胜感激。谢谢。
答案 0 :(得分:6)
strconv.ParseUint()
的行为在strconv.ParseInt()
中有详细说明:
如果base == 0,则字符串的前缀隐含基数:“ 0x”的基数为16,“ 0”的基数为8,否则为10。对于基数1,小于0或大于36的错误,将返回。
因此只需使用base = 0
,然后0x
前缀将被正确解释。
例如:
c, err := strconv.ParseUint("0x0000", 0, 16)
fmt.Println(c, err)
c, err = strconv.ParseUint("0x0100", 0, 16)
fmt.Println(c, err)
输出(在Go Playground上尝试):
0 <nil>
256 <nil>
另一种选择是使用fmt.Sscanf()
:
var c uint16
_, err := fmt.Sscanf("0x0000", "0x%04x", &c)
fmt.Println(c, err)
_, err = fmt.Sscanf("0x0100", "0x%04x", &c)
fmt.Println(c, err)
输出是相同的。在Go Playground上尝试一下。
答案 1 :(得分:2)
首先,您要做的是转换,而不是类型转换。 Go根本不支持类型转换,即使支持,也不是任何语言中类型转换的示例。
但是对于您的实际问题,您有两种选择:
删除“ 0x”前缀:
c, err := strconv.ParseUint("0000", 16, 32)
让strconv使用前缀documented来检测碱基:
如果base == 0,则字符串的前缀隐含基数:“ 0x”的基数为16,“ 0”的基数为8,否则为10。对于基数1,小于0或大于36的错误,将返回。
c, err := strconv.ParseUint("0x0000", 0, 32)
最后,如果您的目标是转换为uint16
,则应该通过请求适当的位大小来告诉ParseUint:
c, err := strconv.ParseUint("0x0000", 0, 16)