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:垃圾回收GC触发条件详解
Apr 24 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
入门学习Go的基本语法
Jul 07 Golang
go goroutine 怎样进行错误处理
Jul 16 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
使用PHP静态变量当缓存的方法
2013/11/13 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
PHP chop()函数讲解
2019/02/11 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
javascript 函数式编程
2007/08/16 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
详解vuejs之v-for列表渲染
2017/06/22 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
详解Python中的动态属性和特性
2018/04/07 Python
Python for循环中的陷阱详解
2018/07/13 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
C语言笔试题
2014/09/04 面试题
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
管理学专业个人求职信范文
2013/09/21 职场文书
家佳咖啡店创业计划书
2013/12/27 职场文书
大学生入党思想汇报
2014/01/01 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
被委托人身份证明
2015/08/07 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL