内容简介:1、golang中base32包是什么?2、base32给我们开发者提供了什么?以及用法?3、编码与解码各有哪几种操作?
1、golang中base32包是什么?
2、base32给我们开发者提供了什么?以及用法?
3、编码与解码各有哪几种操作?
一、golang中base32包是什么?
这个包实现了 RFC 4648 定义的 base32 编码。
二、base32给我们开发者提供了什么?
变量:
RFC 4648 定义的标准 base32 编码。
var StdEncoding = NewEncoding(encodeStd)
RFC 4648 里定义的"Extended Hex Alphabet",一般用于DNS
var HexEncoding = NewEncoding(encodeHex)
函数:
1)func NewDecoder(enc *Encoding, r io.Reader) io.Reader 2)func HexEncoding(enc *Encoding, w io.Writer) io.WriteCloser
CorruptlnputError类型:
1)func (e CorruplnputError) Error() string Encoding类型: 1)func NewEncoding(encoder string) *Encoding 2)func (enc *Encoding) Decode(dst, src []byte) (n int, err error) 3)func (enc *Encoding) DecodeString(s string) ([]byte, error) 4)func (enc *Encoding) DecodedLen(n int) int 5)func (enc *Encoding) Encode(dst, src []byte) 6)func (enc *Encoding) EncodeToString(src []byte) string 7)func (enc *Encoding) Encoden(n int) int
功能详解:
1)func NewDecoder(enc *Encoding, r io.Reader) io.Reader
参数列表: 1)enc Encoding 结构指针 2)w io.Reader 接口 返回值: io.Reader 接口 功能说明: 返回一个io.Reader 接口,用于流式解码
代码实例:
package main
import (
"strings"
"encoding/base32"
"fmt"
)
func main() {
src := "ORUGS4ZANFZSAYJAORSXG5BAON2HE2LOM4XA===="
reader := strings.NewReader(src)
dst := ""
decoder := base32.NewDecoder(base32.StdEncoding, reader)
// 使用一个很小的输出buffer,测试流式解码
buf := make([]byte, 2)
for {
n, err := decoder.Read(buf)
if err != nil || n == 0 {
break
}
dst += string(buf[:n])
fmt.Println(dst)
}
}
2)func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser
参数列表: 1)enc Encoding 结构体 2)w io.Writer 接口 返回值: io.WriteCloser 接口 功能说明: 返回一个io.WriteCloser接口,用于流式编码
代码实例:
package main
import (
"encoding/base32"
"os"
)
func main() {
encoder := base32.NewEncoder(base32.StdEncoding, os.Stdout)
encoder.Write([]byte("this is a test string."))
encoder.Close()
}
3)func NewEncoding(encoder string) *Encoding
参数列表: encoder 32字节长的字符串,用做转换表 返回值: Encoding结构体 功能说明: 计算 base32 解码输出需要的最大字节数
代码实例:
package main
import (
"encoding/base32"
"fmt"
)
func main() {
encodeTest := "--------------------------------"
enc :=base32.NewEncoding(encodeTest)
src := "this is a test string."
dst := enc.EncodeToString([]byte(src))
// 最后不足8字节的会用"="补全
fmt.Println(dst)
fmt.Println(len(dst))
}
4)func (enc *Encoding) Decode(dst, src []byte) (n int, err error)
参数列表: dst 解码缓冲区 src 要解码的字符串切片 返回值: n 解码到缓冲区的字节数 err 可能的错误 功能说明: 对输入的字符串进行base32 解码
代码实例:
package main
import (
"encoding/base32"
"log"
"fmt"
)
func main() {
src := []byte("ORUGS4ZANFZSAYJAORSXG5BAON2HE2LOM4XA====")
// 解码后数据的最长长度
maxLen := base32.StdEncoding.DecodedLen(len(src))
// 解码后的缓存区
dst := make([]byte, maxLen)
// base32 解码
n, err := base32.StdEncoding.Decode(dst, src)
// 打印解码的数据
if err != nil {
log.Fatalln(err)
}
fmt.Println("解码后的数据:", string(dst[:n]))
}
5)func (enc *Encoding) DecodeString(s string) ([]byte, error)
参数列表: s 是要进行 base32 解码的字符串 返回值: 经过base32解码后的字符串切片 可能的错误 功能说明: 对传入的字符串进行base32解码
代码实例:
package main
import (
"encoding/base32"
"log"
"fmt"
)
func main() {
src := "ORUGS4ZANFZSAYJAORSXG5BAON2HE2LOM4XA===="
dst, err := base32.StdEncoding.DecodeString(src)
if err != nil {
log.Fatalln(err)
}
fmt.Println("解码后数据:", string(dst))
}
6)func (enc *Encoding) DecodedLen(n int) int
参数列表: n 表示要进行base32 解码的字节数 返回值: base32 解码输出需要的最大字节数 功能说明: 计算 base32 解码输出需要的最大字节数
代码实例:
package main
import (
"encoding/base32"
"fmt"
)
func main() {
src := "ORUGS4ZANFZSAYJAORSXG5BAON2HE2LOM4XA===="
maxLen := base32.StdEncoding.DecodedLen(len(src))
fmt.Println("解码后的数据最长为:", maxLen)
}
7)func (enc *Encoding) Encode(dst, src []byte)
参数列表: dst 编码缓冲区 src 要编码的字符串切片 返回值: 无 功能说明: 对输入的字符串进行base32编码
代码实例:
package main
import (
"encoding/base32"
"fmt"
)
func main() {
src := []byte("this is a test string.")
maxLen := base32.StdEncoding.EncodedLen(len(src))
dst := make([]byte, maxLen)
base32.StdEncoding.Encode(dst, src)
fmt.Println("编码后的数据为:", string(dst))
}
8)func (enc *Encoding) EncodeToString(src []byte) string
参数列表: src 要进行 base32 编码的字符串切片 返回值: 经过base32 编码后的字符串 功能说明: 对传入的字符串切片进行 base32 编码
代码实例:
package main
import (
"encoding/base32"
"fmt"
)
func main() {
src := []byte("this is a test string.")
dst := base32.StdEncoding.EncodeToString(src)
fmt.Println("编码后的数据为:", dst)
}
9)func (enc *Encoding) EncodedLen(n int) int
参数列表: n 要进行 base32 编码的字节数 返回值: 经过 base32 编码后的字节数 功能说明: 计算编码输出的字节数
代码实例:
package main
import (
"encoding/base32"
"fmt"
)
func main() {
src := []byte("this is a test string.")
maxLen := base32.StdEncoding.EncodedLen(len(src))
fmt.Println("编码后的数据长度为:", maxLen)
}
三、进行编码和解码的几种方式
编码:
1)方法一:base32.StdEncoding.Encode
2)方法二:
base32.StdEncoding.EncodeToString
解码:
1)方法一:base32.StdEncoding.Decode
2)方法二:base32.StdEncoding.DecodeString
不管是编码还是解码,方法一和方法二不同之处是传入的是[]byte、还是string。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
分布式服务架构:原理、设计与实战
李艳鹏、杨彪 / 电子工业出版社 / 2017-8 / 89.00
《分布式服务架构:原理、设计与实战》全面介绍了分布式服务架构的原理与设计,并结合作者在实施微服务架构过程中的实践经验,总结了保障线上服务健康、可靠的最佳方案,是一本架构级、实战型的重量级著作。 《分布式服务架构:原理、设计与实战》以分布式服务架构的设计与实现为主线,由浅入深地介绍了分布式服务架构的方方面面,主要包括理论和实践两部分。理论上,首先介绍了服务架构的背景,以及从服务化架构到微服务架......一起来看看 《分布式服务架构:原理、设计与实战》 这本书的介绍吧!