热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本文主要介绍了Base64、Base58编码与解码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下目录1.常见的编码2.go语言实现base64的

本文主要介绍了Base64、Base58编码与解码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

目录


  • 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编码原理

Base64是一种编码方式,而并非加密,这种编码www.1818xinwen.com因为采用的64种基础字符(可见字符)所以可以全世界通用,大家都认可这一套编码规范


2.2 实现Base64的编码与解码

base64


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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编码表www.qmia.cn


3.1 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,每次得到的余数就是对应www.jsr9.com的58进制,0用编码1来代表:
  • 用余数的值去查表


3.2 base58编解码具体实现


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

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

  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编码与解码的文章



推荐阅读
  • 开发笔记:对称加密详解,以及JAVA简单实现
     (原)常用的加密有3种1、正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
  • java io换行符_Java IO:为什么从stdin读取时,换行符的数字表示出现在控制台上?...
    只是为了更好地理解我在讲座中听到的内容(关于Java输入和输出流),我自己做了这个小程序:publicstaticvoidmain(String[]args)thro ... [详细]
  • 深入理解计算机系统之链接(一)
    程序是怎样运行的写好的c程序怎样运行的呢?答案是一个写好的程序要先经过语言预处理器,编译器,汇编器和链接器生成最后的可执行文件,然后加载器将可执行文件加载到内存中才能运行。这里以一 ... [详细]
author-avatar
2364118915_86406b_479
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有