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。
有疑问加站长微信联系(非本文作者)