Приведение строки к uint16 - PullRequest
0 голосов
/ 27 мая 2019

Я новичок в пути, и я пытался преобразовать строку "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. Я уверен, что это очень тривиально, поэтому любая помощь будет принята с благодарностью. Спасибо.

Ответы [ 2 ]

6 голосов
/ 27 мая 2019

Поведение 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 .

Также см. Связанный вопрос: Преобразовать строку в целочисленный тип в Go?

2 голосов
/ 27 мая 2019

Первое, что вы делаете, это преобразование, а не приведение типа.Go вообще не поддерживает приведение типов, и даже если бы это было так, это не пример приведения типов на любом языке.

Но для вашего реального вопроса у вас есть два варианта:

  1. Удалите префикс "0x":

    c, err := strconv.ParseUint("0000", 16, 32)
    
  2. Пусть strconv обнаружит базу с префиксом, как задокументировано :

    Если base == 0, основание подразумевается префиксом строки: 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)
...