-1

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.

SalmaFG
  • 2,022
  • 3
  • 23
  • 36

2 Answers2

6

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?

icza
  • 389,944
  • 63
  • 907
  • 827
2

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)
Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189