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语言map与string的相互转换的实现
Apr 07 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Golang日志包的使用
Apr 20 Golang
实现GO语言对数组切片去重
Apr 20 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 Golang
Go微服务项目配置文件的定义和读取示例详解
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
php5 mysql分页实例代码
2008/04/10 PHP
PHP教程 变量定义
2009/10/23 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
php array_map()函数实例用法
2021/03/03 PHP
JQuery节点元素属性操作方法
2015/06/11 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
python实现连接mongodb的方法
2015/05/08 Python
python得到windows自启动列表的方法
2018/10/14 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
为什么说python适合写爬虫
2020/06/11 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
自我评价范文分享
2014/01/04 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
运动会通讯稿200字
2014/02/16 职场文书
《春天来了》教学反思
2014/04/07 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
临时用工协议书范本
2014/10/29 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
2015高考寄语集锦
2015/02/27 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers