2 回答

TA贡献1772条经验 获得超6个赞
行为strconv.ParseUint()
详见strconv.ParseInt()
:
如果 base == 0,则基数由字符串的前缀隐含:基数 16 代表“0x”,基数 8 代表“0”,否则基数 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上尝试一下。

TA贡献1796条经验 获得超10个赞
首先,您正在做的是转换,而不是类型转换。Go 根本不支持类型转换,即使支持,这也不是任何语言中类型转换的例子。
但是对于您的实际问题,您有两种选择:
删除“0x”前缀:
c, err := strconv.ParseUint("0000", 16, 32)
让 strconv 检测带有前缀的碱基,如记录的那样:
如果 base == 0,则基数由字符串的前缀隐含:基数 16 代表“0x”,基数 8 代表“0”,否则基数 10。对于基数 1、低于 0 或高于 36,将返回错误。
c, err := strconv.ParseUint("0x0000", 0, 32)
最后,如果您的目标是转换为 a uint16
,您可能应该通过请求适当的位大小来告诉 ParseUint:
c, err := strconv.ParseUint("0x0000", 0, 16)
- 2 回答
- 0 关注
- 320 浏览
添加回答
举报