10 进制转为 62 进制网上有不少文章的,64 进制也就是多了 -
_
这种 10 进制转到高进制,常用在短网址缩短服务中,以下片段是之前 shorturl 跳转程序的部分 编码方法,Python 和 Golang 的。
Python
#coding:utf8
def encode_b64(number):
"""10进制编码为64进制"""
number = int(number)
table = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_'
result = []
temp = number
if 0 == temp:
result.append('0')
else:
while 0 < temp:
result.append(table[temp % 64])
temp /= 64
return ''.join([x for x in reversed(result)])
def decode_b64(string):
"""64进制解码为10进制"""
if not string or not isinstance(string, basestring):
raise TypeError("Invalid string")
table = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5,
"6": 6, "7": 7, "8": 8, "9": 9,
"a": 10, "b": 11, "c": 12, "d": 13, "e": 14, "f": 15, "g": 16,
"h": 17, "i": 18, "j": 19, "k": 20, "l": 21, "m": 22, "n": 23,
"o": 24, "p": 25, "q": 26, "r": 27, "s": 28, "t": 29, "u": 30,
"v": 31, "w": 32, "x": 33, "y": 34, "z": 35,
"A": 36, "B": 37, "C": 38, "D": 39, "E": 40, "F": 41, "G": 42,
"H": 43, "I": 44, "J": 45, "K": 46, "L": 47, "M": 48, "N": 49,
"O": 50, "P": 51, "Q": 52, "R": 53, "S": 54, "T": 55, "U": 56,
"V": 57, "W": 58, "X": 59, "Y": 60, "Z": 61,
"-": 62, "_": 63}
result = 0
for i in xrange(len(string)):
result *= 64
result += table[string[i]]
return result
if __name__ == "__main__":
'''
for n in range(0, 100):
e = encode_b64(n)
print(n, e, decode_b64(e))
'''
from sys import argv
n = argv[1]
e = encode_b64(n)
print("%s %s %s" %(n, e, decode_b64(e)))
print("\n")
用法:将上述代码保存成 xx.py,执行:python xx.py 正整数
Golang
package main
import (
"flag"
"fmt"
"math"
"strconv"
"strings"
)
var tenToAny map[int]string = map[int]string{
0: "0",
1: "1",
2: "2",
3: "3",
4: "4",
5: "5",
6: "6",
7: "7",
8: "8",
9: "9",
10: "a",
11: "b",
12: "c",
13: "d",
14: "e",
15: "f",
16: "g",
17: "h",
18: "i",
19: "j",
20: "k",
21: "l",
22: "m",
23: "n",
24: "o",
25: "p",
26: "q",
27: "r",
28: "s",
29: "t",
30: "u",
31: "v",
32: "w",
33: "x",
34: "y",
35: "z",
36: "A",
37: "B",
38: "C",
39: "D",
40: "E",
41: "F",
42: "G",
43: "H",
44: "I",
45: "J",
46: "K",
47: "L",
48: "M",
49: "N",
50: "O",
51: "P",
52: "Q",
53: "R",
54: "S",
55: "T",
56: "U",
57: "V",
58: "W",
59: "X",
60: "Y",
61: "Z",
62: "-",
63: "_",
}
func main() {
var num int
flag.IntVar(&num, "num", 0, "number")
flag.Parse()
//n, _ := strconv.Atoi(num)
e := decimalToAny(num, 64)
fmt.Println(num, e, anyToDecimal(e, 64))
}
// 10进制转任意进制
func decimalToAny(num, n int) string {
new_num_str := ""
var remainder int
var remainder_string string
for num != 0 {
remainder = num % n
if 76 > remainder && remainder > 9 {
remainder_string = tenToAny[remainder]
} else {
remainder_string = strconv.Itoa(remainder)
}
new_num_str = remainder_string + new_num_str
num = num / n
}
return new_num_str
}
// map根据value找key
func findKey(in string) int {
result := -1
for k, v := range tenToAny {
if in == v {
result = k
}
}
return result
}
// 任意进制转10进制
func anyToDecimal(num string, n int) int {
var new_num float64
new_num = 0.0
nNum := len(strings.Split(num, "")) - 1
for _, value := range strings.Split(num, "") {
tmp := float64(findKey(value))
if tmp != -1 {
new_num = new_num + tmp*math.Pow(float64(n), float64(nNum))
nNum = nNum - 1
} else {
break
}
}
return int(new_num)
}
用法:将上述代码保存成 xx.go,执行:go run xx.go -num 正整数