Go语言实现Base64、Base58编码与解码


Posted in Golang onJuly 26, 2021

1. 常见的编码

base64:26个小写字母、26个大写字母、10个数字、/、+
base58(区块链):去掉6个容易混淆的,去掉0,大写的O、大写的I、小写的L、/、+/、+影响双击选择

2. go语言实现base64的编码与解码

2.1 Base64编码原理

Base64是一种编码方式,而并非加密,这种编码因为采用的64种基础字符(可见字符)所以可以全世界通用,大家都认可这一套编码规范

2.2 实现Base64的编码与解码

base64

package main

import (
 "encoding/base64"
 "fmt"
)

func Base64Encoding(str string) string {  //Base64编码
 src := []byte(str)
 res := base64.StdEncoding.EncodeToString(src)  //将编码变成字符串
 return res
}

func Base64Decoding(str string) string {  //Base64解码
 res,_:=base64.StdEncoding.DecodeString(str)
 return string(res)
}

func main() {
 src := "FanOne"
 res := Base64Encoding(src) // 编码
 fmt.Println("FanOne 编码成为:",res)
 ret := Base64Decoding(res)  //解码
 fmt.Println(res,"解码成为:",ret)
}
/*
结果:
FanOne 编码成为: RmFuT25l
RmFuT25l 解码称为: FanOne
*/

3. go语言实现base58编码与解码

Base58编码表

Go语言实现Base64、Base58编码与解码

3.1 base58的编码过程

Go语言实现Base64、Base58编码与解码

  • 将字符串的每个字节换算成ASCII,字符串实际上就是256进制的数字组合
  • 将256进制的数字转换成10进制数字
  • 将10进制数字转换成58进制数字(除以58,每次得到的余数就是对应的58进制,0用编码1来代表)
  • 将58进制数字对照58编码表找到对应的字符

例子:

  • Fan对应的换成ASCII:77 97 110
  • 将77 97 110的256转换10进值:77256256 + 97*256 + 110 = 4612462
  • 将4612462除以58,每次得到的余数就是对应的58进制,0用编码1来代表:
  • 用余数的值去查表

3.2 base58编解码具体实现

package main

import (
 "bytes"
 "fmt"
 "math/big"
)


var base58= []byte("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")

func Base58Encoding(str string) string {   //Base58编码
 //1. 转换成ascii码对应的值
 strByte := []byte(str)
 //fmt.Println(strByte) // 结果[70 97 110]
 //2. 转换十进制
 strTen := big.NewInt(0).SetBytes(strByte)
 //fmt.Println(strTen)  // 结果4612462
 //3. 取出余数
 var modSlice []byte
 for strTen.Cmp(big.NewInt(0)) > 0 {
  mod:=big.NewInt(0)     //余数
  strTen58:=big.NewInt(58)
  strTen.DivMod(strTen,strTen58,mod)  //取余运算
  modSlice = append(modSlice, base58[mod.Int64()])    //存储余数,并将对应值放入其中
  }
 //  处理0就是1的情况 0使用字节'1'代替
 for _,elem := range strByte{
  if elem!=0{
   break
  }else if elem == 0{
   modSlice = append(modSlice,byte('1'))
  }
 }
 //fmt.Println(modSlice)   //结果 [12 7 37 23] 但是要进行反转,因为求余的时候是相反的。
 //fmt.Println(string(modSlice))  //结果D8eQ
 ReverseModSlice:=ReverseByteArr(modSlice)
 //fmt.Println(ReverseModSlice)  //反转[81 101 56 68]
 //fmt.Println(string(ReverseModSlice))  //结果Qe8D
 return string(ReverseModSlice)
}

func ReverseByteArr(bytes []byte) []byte{   //将字节的数组反转
 for i:=0; i<len(bytes)/2 ;i++{
  bytes[i],bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i],bytes[i]  //前后交换
 }
 return bytes
}

//就是编码的逆过程
func Base58Decoding(str string) string { //Base58解码
 strByte := []byte(str)
 //fmt.Println(strByte)  //[81 101 56 68]
 ret := big.NewInt(0)
 for _,byteElem := range strByte{
  index := bytes.IndexByte(base58,byteElem) //获取base58对应数组的下标
  ret.Mul(ret,big.NewInt(58))     //相乘回去
  ret.Add(ret,big.NewInt(int64(index)))  //相加
 }
 //fmt.Println(ret)  // 拿到了十进制 4612462
 //fmt.Println(ret.Bytes())  //[70 97 110]
 //fmt.Println(string(ret.Bytes()))
 return string(ret.Bytes())
}

func main() {
 src := "Fan"
 res := Base58Encoding(src)
 fmt.Println(res)  //Qe8D
 resD:=Base58Decoding(res)
 fmt.Println(resD)  //Fan
}

4. 最后

到此这篇关于Go语言实现Base64、Base58编码与解码的文章就介绍到这了,更多相关Go语言Base64、Base58编码与解码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
go语言求任意类型切片的长度操作
Apr 26 Golang
golang中的空slice案例
Apr 27 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
Golang的继承模拟实例
Jun 30 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Golang解析JSON对象
Apr 30 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
golang内置函数len的小技巧
Jul 25 #Golang
修改并编译golang源码的操作步骤
Go语言应该什么情况使用指针
Jul 25 #Golang
基于Go语言构建RESTful API服务
Jul 25 #Golang
go goroutine 怎样进行错误处理
Jul 16 #Golang
go开发alertmanger实现钉钉报警
Jul 16 #Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 #Golang
You might like
服务器端解压缩zip的脚本
2006/12/22 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
php对数组排序代码分享
2014/02/24 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
Yii rules常用规则示例
2016/03/15 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
DWR Ext 加载数据
2009/03/22 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
Python的高阶函数用法实例分析
2019/04/11 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
优秀士兵先进事迹
2014/02/06 职场文书
运动会通讯稿150字
2014/02/15 职场文书
交通事故协议书范文
2014/04/16 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL