GolangNote

Golang笔记

Golang 实现 10 进制转 N 进制

Permalink

给定一个不没有重复字符的字符串,如 [0-9,a-z],把一个 10 进制数字转为,该字符集的字符串。应用场合如汽车牌、顺序计数。

Go: 进制转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package main

import (
	"fmt"
	"math"
	"strings"
	"time"
)

var (
	num2char = "0123456789abcdefghijklmnopqrstuvwxyz" // ABCDEFGHIJKLMNOPQRSTUVWXYZ
	bitLen   = int64(len(num2char))
)

func main() {
	fmt.Println(bitLen)
	tm := time.Now().Unix()
	fmt.Println(tm)
	hn := NumToBHex(tm, bitLen)
	fmt.Println(hn)
	fmt.Println(BHex2Num(hn, bitLen))
}

// 10进制数转换 n 进制
func NumToBHex(num, n int64) string {
	numStr := ""
	for {
		if num <= 0 {
			break
		}
		mod := num % n
		num = (num - mod) / n
		numStr = string(num2char[mod]) + numStr
	}
	return numStr
}

// n 进制数转换 10 进制
func BHex2Num(str string, n int64) int64 {
	var v float64
	length := len(str)
	for i := 0; i < length; i++ {
		s := string(str[i])
		index := strings.Index(num2char, s)
		v += float64(index) * math.Pow(float64(n), float64(length-1-i))
	}
	return int64(v)
}

输出结果:

plaintext: 进制转换结果
1
2
3
4
36
1257894000
ksx180
1257894000

10进制转36进制

可以使用内置函数

Go:
1
2
strconv.FormatInt(i int64, base int) string
strconv.ParseInt(s string, base int, bitSize int) (i int64, err error)

Go: 10进制转36进制
1
2
3
4
5
6
7
func int10to36() {
	n := time.Now().Unix()
	s := strconv.FormatInt(n, 36)
	n2, _ := strconv.ParseInt(s, 36, 64)
	// _, _ = strconv.ParseUint(s, 36, 64)
	fmt.Println(n, s, n2)
}

下面是分别使用 Unix, UnixMilli, UnixMicro, UnixNano 取得的10进制转为36进制的结果

plaintext: 输出
1
2
3
4
1257894000 ksx180 1257894000 // Unix
1257894000000 g1v9ly80 1257894000000 // UnixMilli
1257894000000000 cdvwixqm80 1257894000000000 // UnixMicro
1257894000000000000 9k1q7i17da80 1257894000000000000// UnixNano

或者使用 https://github.com/martinlindhe/base36

Go: base36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import "github.com/martinlindhe/base36"

fmt.Println(base36.Encode(5481594952936519619))
// Output: 15N9Z8L3AU4EB

fmt.Println(base36.Decode("15N9Z8L3AU4EB"))
// Output: 5481594952936519619

fmt.Println(base36.EncodeBytes([]byte{1, 2, 3, 4}))
// Output: A2F44

fmt.Println(base36.DecodeToBytes("A2F44"))
// Output: [1 2 3 4]

本文网址: https://golangnote.com/topic/313.html 转摘请注明来源

Related articles

Golang phantomjs 动态代理实现

phantomjs 是个很优秀的软件,虽然现在被chrome headless 抢了风头,但在某些特定场合,使用phantomjs 还是很方便,这里是介绍使用Go 实现动态代理。...

Golang实现简单的Socks5代理

Socks5 代理较 `http/https` 代理有较好的性能,下面是借鉴某个著名开源软件的 local 实现的简单代理。...

Golang 时区时差处理方式

个人习惯用 0 时区时间戳记录时间,可以方便转到不同时区,下面介绍 Golang 时区时差处理...

Write a Comment to "Golang 实现 10 进制转 N 进制"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.18 Processed in 1ms