Golang 数基转换

Golang number base conversion

我想知道,如何在不使用 Golang 中的 strconv 的情况下将以 10 为基数的数字从一个基数转换为另一个基数?

你能给我一些建议吗?

这可能是作弊,但我想您可以查看 strconv.FormatInt 的实现,并使用它作为示例构建您自己的一些代码。这样你就不会直接使用它,你已经自己实现了它。

使用 math package and a log identify:

log_77(x) = log(x) / log(77)

您可以使用此函数将任何十进制数转换为具有您选择的字符集的任何基数。

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
package main

import (
    "fmt"
    "math/big"
)

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

Demo