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))
}
我想知道,如何在不使用 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))
}