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 相关文章推荐
golang正则之命名分组方式
Apr 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
解决Go gorm踩过的坑
Apr 30 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
goland设置颜色和字体的操作
May 05 Golang
goland 设置project gopath的操作
May 06 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go 实现简易端口扫描的示例
May 22 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang获取List列表元素的四种方式
Apr 20 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
PHP安全配置
2006/12/06 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
js里面的变量范围分享
2020/07/18 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
python利用装饰器进行运算的实例分析
2015/08/04 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
python实现处理mysql结果输出方式
2020/04/09 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
荟萃全球保健品:维他购
2018/05/09 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
面试后感谢信
2014/02/01 职场文书
供货协议书
2014/04/22 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
励志演讲稿大全
2014/08/21 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
博士论文答辩开场白
2015/06/01 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书