dpf25323
2019-05-27 12:28
浏览 595
已采纳

将字符串转换为uint16

I'm new at go and I've been trying to cast the string "0x0000" into a hexadecimal with no luck so far. Here's what I tried:

import "strconv"

c, err := strconv.ParseUint("0x0000", 16, 32)
if err != nil {
    return err, nil
}

which throws the error: strconv.ParseUint: parsing "0x0000": invalid syntax.

I've also tried uint16("0x0000") but apparently I also can't convert a string directly to uint16. I'm sure it's very trivial, so any help would be appreciated. Thanks.

图片转代码服务由CSDN问答提供 功能建议

我是新手,我一直在尝试将字符串“ 0x0000”转换为不包含十六进制的字符串 运气到目前为止。 这是我尝试的方法:

  import“ strconv” 
 
c,err:= strconv.ParseUint(“ 0x0000”,16,32)
if err!= nil {  
返回错误,nil 
} 
   
 
 

,将引发错误: strconv.ParseUint:解析“ 0x0000”:无效语法

我也尝试过 uint16(“ 0x0000”),但显然我也无法将字符串直接转换为 uint16 。 我敢肯定这是微不足道的,所以任何帮助将不胜感激。 谢谢。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dongshenyu4638 2019-05-27 12:40
    已采纳

    The behavior of strconv.ParseUint() is detailed at strconv.ParseInt():

    If base == 0, the base is implied by the string's prefix: base 16 for "0x", base 8 for "0", and base 10 otherwise. For bases 1, below 0 or above 36 an error is returned.

    So simply use base = 0, and then the 0x prefix will be interpreted properly.

    For example:

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

    Output (try it on the Go Playground):

    0 <nil>
    256 <nil>
    

    Another option is to use 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)
    

    Output is the same. Try it on the Go Playground.

    Also see related question: Convert string to integer type in Go?

    已采纳该答案
    打赏 评论
  • dongqiang4819 2019-05-27 12:41

    First, what you're doing is a conversion, not a type cast. Go doesn't support type casting at all, and even if it did, this is not an example of typecasting in any language.

    But for your actual question, you have two options:

    1. Remove the "0x" prefix:

      c, err := strconv.ParseUint("0000", 16, 32)
      
    2. Let strconv detect the base with the prefix, as documented:

      If base == 0, the base is implied by the string's prefix: base 16 for "0x", base 8 for "0", and base 10 otherwise. For bases 1, below 0 or above 36 an error is returned.

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

    And finally, if your goal is to convert to a uint16, you should probably tell ParseUint as much, by requesting the appropriate bitsize:

    c, err := strconv.ParseUint("0x0000", 0, 16)
    
    打赏 评论

相关推荐 更多相似问题