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

导入方式:

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个可打印字符)举例:
转换前:          01110011 00110001 00110011
拆分成4份:        011100 110011 000100 110011
高位补0:          00011100 00110011 00000100 00110011
对应的值为:       28 51 4 51
转成对应的ASCII码: c z E z

  • 每76个字符加一个换行符
  • 最后的结束符也要处理
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的'='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将“+”和“/”改成了“!”和“-”,因为“+”,“/”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。

type Encoding

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

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

func NewEncoding

func NewEncoding(encoder string) *Encoding

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

Variables

var StdEncoding = NewEncoding(encodeStd)

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

var URLEncoding = NewEncoding(encodeURL)

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

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

func (*Encoding) EncodeToString

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

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

func (*Encoding) DecodeString

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

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

举例:

package main
import("fmt""encoding/base64"
)func main() { msg := "Hello,world" //11个字符应该装成15个base64编码的字符encoded := base64.StdEncoding.EncodeToString([]byte(msg))fmt.Println(encoded) //SGVsbG8sd29ybGQ=,后面的=是作填充用的decoded, err := base64.StdEncoding.DecodeString(encoded)if err != nil {fmt.Println("decode error:", err) return } fmt.Println(string(decoded))//Hello,world }

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

解码字符:

func (*Encoding) DecodedLen

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

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

func (*Encoding) Decode

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

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

举例:

package main
import("encoding/base64""log""fmt""io"
)func main() { encoded := "Zm9vLGJhcg=="n := base64.StdEncoding.DecodedLen(len(encoded))//DecodedLen返回len(encoded)字节base64编码的数据解码后的最大长度fmt.Println(n) //9dbuf := make([]byte, n) _, err :=base64.StdEncoding.Decode(dbuf, []byte(encoded))if err != nil && err != io.EOF {log.Fatal("Read failed", err)}fmt.Printf("decoded result : %s\n", dbuf) //decoded result : foo,bar
}

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

func (*Encoding) EncodedLen

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

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

func (*Encoding) Encode

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

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

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

举例:

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

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

func NewEncoder(可写Write)

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

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

举例:

package main
import("encoding/base64""os"
)func main() { input := []byte("foo,bar")encoder := base64.NewEncoder(base64.StdEncoding, os.Stdout) //生成一个编码器,会将调用Write()写入的值编码后写到os.Stdout中
    encoder.Write(input)encoder.Close()//返回Zm9vLGJhcg==
}

func NewDecoder(可读-Read)

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

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

举例:

package main
import("encoding/base64""strings""log""fmt""io"
)func main() { encoded := "Zm9vLGJhcg=="decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(encoded))n := base64.StdEncoding.DecodedLen(len(encoded))//DecodedLen返回len(encoded)字节base64编码的数据解码后的最大长度fmt.Println(n) //9dbuf := make([]byte, n) _, err := decoder.Read(dbuf)//将读取的解码后的值写到dbuf中if err != nil && err != io.EOF {log.Fatal("Read failed", err)}fmt.Printf("decoded result : %s\n", dbuf) //decoded result : foo,bar
}

转载于:https://www.cnblogs.com/wanghui-garcia/p/10422951.html

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标准库的学习-crypto/sha1

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

  4. 《C++标准库》学习笔记 — STL —流

    <C++标准库>学习笔记 - STL -流 一.操控器 1.原理 2.自定义操控器 3.控制输入的宽度 二.自定义 I/O 操作符 1.重载输出操作符 2.输入操作符 三.自定义格式化标志 ...

  5. C++“准”标准库Boost学习指南(1):智能指针Boost.smart_ptr

    我们学习C++都知道智能指针,例如STL中的std::auto_ptr,但是为什么要使用智能指针,使用它能带给我们什么好处呢? 最简单的使用智能指针可以不会因为忘记delete指针而造成内存泄露.还有 ...

  6. python标准库之socket_python标准库SocketServer学习

    导语:大牛们常常说阅读源码是很低效的学习方法.但对我辈初学者而言,阅读源码却是掌握编程思想.编码规范的好途径.简而言之,读源码不是万能的,不读源码是万万不能的. SocketServer是标准库中一个 ...

  7. c++标准库--cstdio学习

    cstdio学习 宏 类型 函数 printf() scanf 输出 源代码 宏 EOF :表示已到达文件结尾或发出其他一些故障情况 NULL:表示空指针 类型 FILE:包含控制流的信息的对象 函数 ...

  8. go标准库的学习-crypto/aes

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/aes" aes包实现了AES加密算法,参见U.S. Federal ...

  9. go标准库的学习-sync互斥

    https://studygolang.com/pkgdoc 导入方法: import "sync" sync包提供了基本的同步基元,如互斥锁.除了Once和WaitGroup类型 ...

  10. go标准库的学习-time

    参考https://studygolang.com/pkgdoc 导入形式: import "time" time包提供了时间的显示和测量用的函数.日历的计算采用的是公历. 1&g ...

最新文章

  1. HDU 1251(trie树)
  2. java保留小数_(转)Java保留小数位数的N中方法
  3. markdown软件_实用软件推荐|Markdown文本编辑器之Typora
  4. 通用的Java hashCode重写方案
  5. JXLS 2.4.0系列教程(四)——拾遗 如何做页面小计
  6. python同时输出多个值_python如何实现输出多个值?
  7. 创建一个带参数的formgoup_gin框架如何获取带文件的formData请求?
  8. Java Web学习总结(41)——Java EE 8 新功能展望
  9. 盘点国内外私募基金业绩报酬计提方式
  10. PUN☀️三、服务器大厅、服务器房间
  11. 【MAC】手动下载安装docker
  12. Operator学习笔记
  13. html 制作人物模型,星际科幻人物模型材质教程 Stargazer Character Design Tutorial
  14. 查看数据库信息(一)
  15. Chrome下载危险文件拦截手动绕过
  16. TP+UC+DZ同步登陆问题汇总
  17. 什么是英雄?撒贝宁满分回答我要背下来
  18. 2023年互联网技术发展趋势浅析
  19. css透明度设置--背景透明但文字不透明
  20. 8款数据迁移工具选型,主流且实用

热门文章

  1. Atitit 接受post raw数据目录1. 接受get参数 11.1. //req.query只能拿到get参数 //post请求使用 body-parser拿到 12. 原生expre
  2. Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  3. Atitit 实体的概念与理解 目录 1. 使用不同的语言来描述实体 1 1.1. H5 table dom模型 json 1 1.2. Sql table 1 1.3. Java class m
  4. Atitit常见的标准化组织与规范数量jcp ecma iso
  5. Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途
  6. atitit.元编程总结 o99
  7. paip.提升安全性----Des加密 java php python的实现总结
  8. paip.验证码识别---使用字符集的选取
  9. paip.图形化编程厉器.net vs2010 工作流WF4 hello word
  10. paip.使用泛型时未能找到类型或命名空间名称“T