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 http使用踩过的坑与填坑指南
Apr 27 Golang
彻底理解golang中什么是nil
Apr 29 Golang
golang slice元素去重操作
Apr 30 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
golang内置函数len的小技巧
Jul 25 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go语言怎么使用变长参数函数
Jul 15 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调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
Javascript - HTML的request类
2007/01/09 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
js实现左右轮播图
2020/01/09 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
vue中activated的用法
2021/01/03 Vue.js
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
Python实现数字的格式化输出
2020/08/01 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
外语系毕业生找工作的求职信
2013/11/28 职场文书
毕业生的自我评价
2013/12/30 职场文书
学习委员竞选稿
2015/11/20 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL