Преобразование базы чисел Голанга

Мне было интересно, как вы конвертируете число base10 из одной базы в другую без использования strconv в Golang?

Не могли бы вы дать мне несколько советов?


person Elmor    schedule 02.02.2017    source источник
comment
так какой фон вы не хотите использовать strconv ?   -  person ymonad    schedule 02.02.2017
comment
конечно, вы можете сделать что-то вроде этого: Go Playground, но я не знаю, что это что вы хотите.   -  person ymonad    schedule 02.02.2017
comment
Сначала я использовал strconv, но изучив задачу, я обнаружил, что в требованиях не было использования этого пакета.   -  person Elmor    schedule 02.02.2017
comment
и я не хочу заканчивать с кучей if else вроде golang.org/src/strconv/itoa.go?s=628:668#L60   -  person Elmor    schedule 02.02.2017
comment
Основание имеет отношение только к строковому представлению, так почему бы не использовать для этого strconv? В противном случае вы просто будете реализовывать функции из strconv самостоятельно. (Кстати, вы читали исходный код if itoa.go? Цепочка if else, которая не очень длинная и состоит из 3 блоков, предназначена только для оптимизации.)   -  person JimB    schedule 02.02.2017
comment
@Elmor, проверьте, нравится ли вам мой ответ   -  person Ravi    schedule 29.12.2019


Ответы (4)


Используйте пакет math и журнал идентифицировать:

журнал_77 (х) = журнал (х) / журнал (77)

person Michael Pettigrew    schedule 03.02.2017

package main

import (
    "fmt"
    "math/big"
)

func main() {
    fmt.Println(big.NewInt(1000000000000).Text(62))
}

Демо

person Ravi    schedule 16.12.2019

Вероятно, это мошенничество, но я думаю, вы могли бы взглянуть на реализацию strconv.FormatInt и создайте собственный код, используя его в качестве примера. Таким образом, вы не используете его напрямую, вы сами его реализовали.

person ctcherry    schedule 02.02.2017

Вы можете использовать эту функцию для преобразования любого десятичного числа в любое основание с набором символов по вашему выбору.

func encode(nb uint64, buf *bytes.Buffer, base string) {
  l := uint64(len(base))
  if nb/l != 0 {
    encode(nb/l, buf, base)
  }
  buf.WriteByte(base[nb%l])
}

func decode(enc, base string) uint64 {
  var nb uint64
  lbase := len(base)
  le := len(enc)
  for i := 0; i < le; i++ {
    mult := 1
    for j := 0; j < le-i-1; j++ {
        mult *= lbase
    }
    nb += uint64(strings.IndexByte(base, enc[i]) * mult)
  }
  return nb
}

Вы можете использовать его так:

// encoding
var buf bytes.Buffer
encode(100, &buf, "0123456789abcdef")
fmt.Println(buf.String())
// 64

// decoding
val := decode("64", "0123456789abcdef")
fmt.Println(val)
// 100
person Asdine    schedule 21.01.2018