Как преобразовать массив шестнадцатеричных рун фиксированной длины в одно целое число - PullRequest
1 голос
/ 13 июля 2020

Учитывая массив рун, который представляет собой строку, закодированную в шестнадцатеричном формате, как я могу преобразовать его в одно целое число. Например:

var digits [8]rune = "00000010"
magicFunction(digits)
// gives 16

var digits2 [8]rune = "deadbeef"
magicFunction(digits2)
// gives 3735928559

Go s encoding/hex кажется, что он может конвертировать только в байтовый массив (с Decode или DecodeString).

Я мог бы преобразовать массив рун в строку, а затем использовать DecodeString, но я не могу понять, как затем получить целое число из массива байтов, который он создает. Массив будет фиксированной длины (8), поэтому мне не нужен массив переменных, мне нужно одно значение!

За исключением повторной реализации алгоритма шестнадцатеричного декодирования, есть ли правильный / хороший способ сделать это?

1 Ответ

1 голос
/ 13 июля 2020

Обратите внимание, что держать число в [8]rune выглядит странно и неэффективно. Но если вы должны ...

Если производительность не критична, просто преобразуйте введенные вами руны в string и вызовите strconv.ParseInt(), передав 16 в качестве основы:

func magicFunction(rs [8]rune) (uint32, error) {
    x, err := strconv.ParseInt(string(rs[:]), 16, 64)
    return uint32(x), err
}

Пример тестирования:

var digits [8]rune = [8]rune{'0', '0', '0', '0', '0', '0', '1', '0'}
fmt.Println(magicFunction(digits))
// gives 16

var digits2 [8]rune = [8]rune{'d', 'e', 'a', 'd', 'b', 'e', 'e', 'f'}
fmt.Println(magicFunction(digits2))
// gives 3735928559

Вывод (попробуйте на Go Playground ):

16 <nil>
3735928559 <nil>

Если производительность имеет значение: тогда сделайте это "by рука ": число, содержащее результат, и на каждом di git сдвиге влево на 4, преобразование руны в ее числовое значение и побитовое ИЛИ с переменной.

...