参考:https://studygolang.com/pkgdoc

导入方式:

  1. import "encoding/base64"

base64实现了RFC 4648规定的base64编码。Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符(即6Bits)来表示二进制数据(即8Bits)的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息,这样更适合放在URL中进行传递。此时,采用Base64编码具有不可读性,需要解码后才能阅读。

该编码的规则就是:

  • 把3个字符变成4个字符:方法就是先将3个8Bits(3*8=24Bits)的值分成4个6Bits的值(4*6=24Bits),然后在这四个6Bits值前添加两个0将其变为8Bits的值,这样就能够保证生成的4个值表示的值大小为(0~63),即可以将其转成对应的ASCII码(64个可打印字符)举例:
  1. 转换前:
  2. 拆分成4份:
  3. 高位补0:
  4. 对应的值为:
  5. 转成对应的ASCII码: c z E z
  • 每76个字符加一个换行符
  • 最后的结束符也要处理
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
 
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
 
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“/”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。
 

type Encoding

  1. type Encoding struct {
  2. // 内含隐藏或非导出字段
  3. }

双向的编码/解码协议,根据一个64字符的字符集定义,RFC 4648标准化了两种字符集。默认字符集用于MIME(RFC 2045)和PEM(RFC 1421)编码;另一种用于URL和文件名,用'-'和'_'替换了'+'和'/'。

func NewEncoding

  1. func NewEncoding(encoder string) *Encoding

使用给出的字符集生成一个*Encoding,字符集必须是64字节的字符串。

Variables

  1. var StdEncoding = NewEncoding(encodeStd)

RFC 4648定义的标准base64编码字符集。

  1. var URLEncoding = NewEncoding(encodeURL)

RFC 4648定义的另一base64编码字符集,用于URL和文件名。

下面的两个函数分别就是编码和解码的过程:

func (*Encoding) EncodeToString

  1. func (enc *Encoding) EncodeToString(src []byte) string

返回将src编码后的字符串。

func (*Encoding) DecodeString

  1. func (enc *Encoding) DecodeString(s string) ([]byte, error)

返回base64编码的字符串s代表的数据。

举例:

  1. package main
  2. import(
  3. "fmt"
  4. "encoding/base64"
  5. )
  6.  
  7. func main() {
  8. msg := "Hello,world" //11个字符应该装成15个base64编码的字符
  9. encoded := base64.StdEncoding.EncodeToString([]byte(msg))
  10. fmt.Println(encoded) //SGVsbG8sd29ybGQ=,后面的=是作填充用的
  11. decoded, err := base64.StdEncoding.DecodeString(encoded)
  12. if err != nil {
  13. fmt.Println("decode error:", err)
  14. return
  15. }
  16. fmt.Println(string(decoded))//Hello,world
  17. }

下面的方法不是将他们编码成字符串:

解码字符:

func (*Encoding) DecodedLen

  1. func (enc *Encoding) DecodedLen(n int) int

返回n字节base64编码的数据解码后的最大长度。

func (*Encoding) Decode

  1. func (enc *Encoding) Decode(dst, src []byte) (n int, err error)

将src的数据解码后存入dst,最多写DecodedLen(len(src))字节数据到dst,并返回写入的字节数。 如果src包含非法字符,将返回成功写入的字符数和CorruptInputError。换行符(\r、\n)会被忽略。

举例:

  1. package main
  2. import(
  3. "encoding/base64"
  4. "log"
  5. "fmt"
  6. "io"
  7. )
  8.  
  9. func main() {
  10. encoded := "Zm9vLGJhcg=="
  11. n := base64.StdEncoding.DecodedLen(len(encoded))//DecodedLen返回len(encoded)字节base64编码的数据解码后的最大长度
  12. fmt.Println(n) //
  13. dbuf := make([]byte, n)
  14. _, err :=base64.StdEncoding.Decode(dbuf, []byte(encoded))
  15.  
  16. if err != nil && err != io.EOF {
  17. log.Fatal("Read failed", err)
  18. }
  19. fmt.Printf("decoded result : %s\n", dbuf) //decoded result : foo,bar
  20. }

下面两个代码组合进行编码:

func (*Encoding) EncodedLen

  1. func (enc *Encoding) EncodedLen(n int) int

返回n字节数据进行base64编码后的最大长度。

func (*Encoding) Encode

  1. func (enc *Encoding) Encode(dst, src []byte)

将src的数据编码后存入dst,最多写EncodedLen(len(src))字节数据到dst,并返回写入的字节数。

函数会把输出设置为4的倍数,因此不建议对大数据流的独立数据块执行此方法,使用NewEncoder()代替。

举例:

  1. package main
  2. import(
  3. "encoding/base64"
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. decoded := "foo,bar"
  9. n := base64.StdEncoding.EncodedLen(len(decoded))//DecodedLen返回len(encoded)字节base64编码的数据解码后的最大长度
  10. fmt.Println(n) //
  11. dbuf := make([]byte, n)
  12. base64.StdEncoding.Encode(dbuf, []byte(decoded))
  13.  
  14. fmt.Printf("encode result : %s\n", dbuf) //encode result : Zm9vLGJhcg==
  15. }

下面就是生成编码器和解码器的方法,其实和上面的Encode和Decode实现的效果一样,在编码的是大数据流时使用下面的方法:

func NewEncoder(可写Write)

  1. func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser

创建一个新的base64流编码器。写入的数据会在编码后再写入w,base32编码每3字节执行一次编码操作;写入完毕后,使用者必须调用Close方法以便将未写入的数据从缓存中刷新到w中。

举例:

  1. package main
  2. import(
  3. "encoding/base64"
  4. "os"
  5. )
  6.  
  7. func main() {
  8. input := []byte("foo,bar")
  9. encoder := base64.NewEncoder(base64.StdEncoding, os.Stdout) //生成一个编码器,会将调用Write()写入的值编码后写到os.Stdout中
  10. encoder.Write(input)
  11.  
  12. encoder.Close()
  13. //返回Zm9vLGJhcg==
  14. }

func NewDecoder(可读-Read)

  1. func NewDecoder(enc *Encoding, r io.Reader) io.Reader

创建一个新的base64流解码器。

举例:

  1. package main
  2. import(
  3. "encoding/base64"
  4. "strings"
  5. "log"
  6. "fmt"
  7. "io"
  8. )
  9.  
  10. func main() {
  11. encoded := "Zm9vLGJhcg=="
  12. decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(encoded))
  13. n := base64.StdEncoding.DecodedLen(len(encoded))//DecodedLen返回len(encoded)字节base64编码的数据解码后的最大长度
  14. fmt.Println(n) //
  15. dbuf := make([]byte, n)
  16. _, err := decoder.Read(dbuf)//将读取的解码后的值写到dbuf中
  17. if err != nil && err != io.EOF {
  18. log.Fatal("Read failed", err)
  19. }
  20. fmt.Printf("decoded result : %s\n", dbuf) //decoded result : foo,bar
  21. }

go标准库的学习-encoding/base64的更多相关文章

  1. go标准库的学习-encoding/json

    参考https://studygolang.com/pkgdoc 导入方式: import "encoding/json" json包实现了json对象的编解码,参见RFC 462 ...

  2. go标准库的学习-encoding/xml

    参考:https://studygolang.com/pkgdoc 导入方式: import "encoding/xml" 实现的简单的理解XML命名空间的XML 1.0编译器 f ...

  3. go标准库的学习-net/http

    参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...

  4. go标准库的学习-database/sql

    参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...

  5. go标准库的学习-crypto/md5

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...

  6. go标准库的学习-crypto/sha1

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...

  7. go标准库的学习-crypto/sha256

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...

  8. python 标准库基础学习之开发工具部分1学习

    #2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...

  9. python calendar标准库基础学习

    # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

随机推荐

  1. ASP.NET新增数据返回自增ID

    一.情景引入 项目需求:对于一个数据表(表A)的增.删.改全部要有日志记录,日志表(表B)结构 中需要记录表A的自增ID,这样才能将日志与操作的数据一一对应起来. 对于删和改都好办,获取Model时都 ...

  2. MVC 【Razor 视图引擎】案例分析

    using MvcApplication1.Models; using System; using System.Collections.Generic; using System.Linq; usi ...

  3. 深入理解Java虚拟机--阅读笔记三

    垃圾收集器 手机算法是内存回收的方法论,垃圾收集器是内存回收的具体实现. 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:值用户线程与垃圾收集线程同时执行(但并不一定是并行的) ...

  4. Ajax实现的城市二级联动二

    上一篇联动一种只是城市用ajax请求获取并渲染,这里将省份也用ajax请求并渲染 1.HTML <select id="province"> <option> ...

  5. API接口规范V1.0——制定好规范,才好合作开发

    返回码规范: 统一六位 000000 表示成功! 参数相关返回码预留100000-199999:系统相关返回码预留200000-299999:数据中心310000-319999后续项目以此类推,后续根 ...

  6. spring项目获取ServletContext

    (1)生命周期 ServletContext中的属性的生命周期从创建开始,到服务器关闭而 (2).获取ServletContext 1.request获取servletContext ServletC ...

  7. 获取url参数的方法(web)

    //获取url参数的方法(web) function GetQueryString(name) {     var reg = new RegExp("(^|&)" + n ...

  8. ExtJS学习之MessageBox

    MessageBox为ExtJS中的消息对话框,包括alert  confirm prompt show四种. 1.index.html <!DOCTYPE html PUBLIC " ...

  9. CSS&JS两种方式实现手风琴式折叠菜单

    <div class="accordion"> <div id="one" class="section"> < ...

  10. PHP会话(Session)实现用户登陆功能 转自#落人间#

    对比起 Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Session 的使用. 由于 Session 是以文本文件形式存储在 ...