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

相关文章
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
172 1
|
4月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
289 1
|
4月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
377 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
244 0
|
4月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
219 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
315 0
|
4月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
10月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
10月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
4月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。

热门文章

最新文章