Go语言实现Base64、Base58编码与解码

简介: 目录1. 常见的编码2. go语言实现base64的编码与解码2.1 Base64编码原理2.2 实现Base64的编码与解码3. go语言实现base58编码与解码3.1 base58的编码过程3.2 base58编解码具体实现4. 最后

目录

1. 常见的编码

2. go语言实现base64的编码与解码

2.1 Base64编码原理

2.2 实现Base64的编码与解码

3. go语言实现base58编码与解码

3.1 base58的编码过程

3.2 base58编解码具体实现

4. 最后

1. 常见的编码

base64:26个小写字母、26个大写字母、10个数字、/、+


base58(区块链):去掉6个容易混淆的,去掉0,大写的O、大写的I、小写的L、/、+/、+影响双击选择


2. go语言实现base64的编码与解码

2.1 Base64编码原理

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编码表

image.png


3.1 base58的编码过程

image.png


将字符串的每个字节换算成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. 最后

小生凡一,期待你的关注。

image.png

相关文章
|
18天前
|
Go
go语言中的数据类型
go语言中的数据类型
13 0
|
24天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
24天前
|
安全 Go
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
|
24天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
5天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
24天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
2天前
|
安全 Go 开发者
Golang深入浅出之-Go语言并发编程面试:Goroutine简介与创建
【4月更文挑战第22天】Go语言的Goroutine是其并发模型的核心,是一种轻量级线程,能低成本创建和销毁,支持并发和并行执行。创建Goroutine使用`go`关键字,如`go sayHello(&quot;Alice&quot;)`。常见问题包括忘记使用`go`关键字、不正确处理通道同步和关闭、以及Goroutine泄漏。解决方法包括确保使用`go`启动函数、在发送完数据后关闭通道、设置Goroutine退出条件。理解并掌握这些能帮助开发者编写高效、安全的并发程序。
10 1
|
2天前
|
人工智能 Go 调度
掌握Go并发:Go语言并发编程深度解析
掌握Go并发:Go语言并发编程深度解析
|
2天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
3天前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
11 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解