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语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang日志包logger的用法详解
May 05 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang入门之计时器
May 04 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 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目录遍历函数opendir用法实例
2014/11/20 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
tensorflow 模型权重导出实例
2020/01/24 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
性能测试工程师的面试题
2015/02/20 面试题
贸易经济专业自荐书
2014/06/29 职场文书
师德师风个人整改措施
2014/10/27 职场文书
西柏坡观后感
2015/06/08 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
如何利用js在两个html窗口间通信
2021/04/27 Javascript
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers