解码编码
一、常见的编码
-
base64:26个小写字母、26个大写字母、10个数字、/、+
-
base58(区块链):去掉6个容易混淆的,去掉0,大写的O、大写的I、小写的L、/、+
- /、+影响双击选择
二、go实现base64编码、解码
- 编码
使用:encoding/base64
input := []byte("hello world")
encodeString := base64.StdEncoding.EncodeToString(input)
在url中使用:
uEnc := base64.URLEncoding.EncodeToString([]byte(input))
- 解码
decodeBytes, err := base64.StdEncoding.DecodeString(encodeString) 在url中使用: uDec, err := base64.URLEncoding.DecodeString(uEnc)
三、go实现base58编码解码、解码
base58编码表
字符1代表0,字符2代表1,…,字符z代表57
-
编码
-
流程:
-
将字符串的每个字节换算成ASCII,字符串实际上就是256进制的数字组合
-
将256进制的数字转换成10进制数字
-
将10进制数字转换成58进制数字(除以58,每次得到的余数就是对应的58进制,0用编码1来代表)
-
将58进制数字对照58编码表找到对应的字符
-
256进制转十进制:
-
h:104
-
a:97
-
104*256+97=26721
package utils
import (
"fmt"
"math/big"
"bytes"
)
var b58 = []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")
// base58编码
func Base58Encoding(src string) (string) {
// he : 104 101 --> 104*256 + 101 = 26725
// 26725 / 58 = 15 16 17
// 1.ascii码对应的值
src_byte := []byte(src)
// 转成十进制
i := big.NewInt(0).SetBytes(src_byte)
var mod_slice []byte
// 循环取余
//for i.Cmp(big.NewInt(0)) != 0 {
for i.Cmp(big.NewInt(0)) > 0 {
mod := big.NewInt(0)
i58 := big.NewInt(58)
// 取余
i.DivMod(i,i58,mod)
// 将余数添加到数组中
mod_slice = append(mod_slice, b58[mod.Int64()])
}
// 把0使用字节'1'代替
for _,s := range src_byte {
if s != 0 {
break
}
mod_slice = append(mod_slice, byte('1'))
}
// 反转byte数组
//ret_mod_slice := ReverseByteArr(mod_slice)
ret_mod_slice := ReverseByteArr2(mod_slice)
fmt.Println(ret_mod_slice)
return string(ret_mod_slice)
}
// byte数组进行反转方式1
func ReverseByteArr(b []byte) []byte{
for i:=0; i<len(b)/2;i++ {
b[i],b[len(b)-1-i] = b[len(b)-1-i],b[i]
}
return b
}
// byte数组进行反转方式2
func ReverseByteArr2(b []byte) []byte{
for i,j:=0,len(b)-1;i<j;i,j = i+1,j-1{
b[i] ,b[j] = b[j],b[i]
}
return b
}
- 解码
// base58解码
func Base58Decoding(src string) string{
// 转成byte数组
src_byte := []byte(src)
//fmt.Println(src_byte)
// 这里得到的是十进制
ret := big.NewInt(0)
for _, b := range src_byte {
//fmt.Println(b)
i := bytes.IndexByte(b58,b)
fmt.Println(i)
// 乘回去
ret.Mul(ret,big.NewInt(58))
// 相加
ret.Add(ret,big.NewInt(int64(i)))
}
return string(ret.Bytes())
}