【问题标题】:Casting string to uint16将字符串转换为 uint16
【发布时间】:2025-12-25 03:45:07
【问题描述】:

我是新手,我一直在尝试将字符串“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。我敢肯定这是非常微不足道的,所以任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: string go casting hex


    【解决方案1】:

    strconv.ParseUint() 的行为详见strconv.ParseInt()

    如果 base == 0,则字符串前缀隐含了 base:base 16 表示“0x”,base 8 表示“0”,否则为 base 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 上试试吧。

    另见相关问题:Convert string to integer type in Go?

    【讨论】:

    • 非常感谢!我一直试图让它工作几个小时。
    【解决方案2】:

    首先,您所做的是转换,而不是类型转换。 Go 根本不支持类型转换,即使支持,这也不是任何语言的类型转换示例。

    但对于您的实际问题,您有两种选择:

    1. 去掉“0x”前缀:

      c, err := strconv.ParseUint("0000", 16, 32)
      
    2. 让strconv检测带前缀的碱基,如documented:

      如果 base == 0,则字符串前缀隐含了 base:base 16 表示“0x”,base 8 表示“0”,否则为 base 10。对于基数 1、低于 0 或高于 36 会返回错误。

      c, err := strconv.ParseUint("0x0000", 0, 32)
      

    最后,如果您的目标是转换为 uint16,您可能应该通过请求适当的位大小来告诉 ParseUint:

    c, err := strconv.ParseUint("0x0000", 0, 16)
    

    【讨论】: