作者:fspygh | 来源:互联网 | 2023-05-18 01:42
简介Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息。Go的encodingbase64提供了对base64的编解码操作。
简介
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息。Go 的 encoding/base64 提供了对base64的编解码操作。
encoding/base64 定义了一个Encoding结构体,表示Base64的编/解码器。并且导出了四个常用的Encoding对象:StdEncoding、URLEncoding、RawStdEncoding、RawURLEncoding。StdEncoding表示标准的编/解码器。URLEncoding用于对URL编解码,编解码过程中会将Base64编码中的特殊标记+和/替换为-和_。RawStdEncoding和RawURLEncoding是StdEncoding和URLEncoding的非padding版本。主要API如下:
var StdEncoding = NewEncoding(encodeStd)
var URLEncoding = NewEncoding(encodeURL)
var RawStdEncoding = StdEncoding.WithPadding(NoPadding)
var RawURLEncoding = URLEncoding.WithPadding(NoPadding)
type Encoding struct {
}
func (enc *Encoding) Decode(dst, src []byte) (n int, err error)
func (enc *Encoding) DecodeString(s string) ([]byte, error)
func (enc *Encoding) Encode(dst, src []byte)
func (enc *Encoding) EncodeToString(src []byte) string
func (enc Encoding) WithPadding(padding rune) *Encoding
func NewDecoder(enc *Encoding, r io.Reader) io.Reader
func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser
Encoding应用
下面的程序演示了 Encoding 的用法:
package main
import (
"encoding/base64"
"errors"
"fmt"
)
func mustDecode(enc *base64.Encoding, str string) string {
data, err := enc.DecodeString(str)
if err != nil {
panic(err)
}
return string(data)
}
func testEncoding(enc *base64.Encoding, str string) {
encStr := enc.EncodeToString([]byte(str))
fmt.Println(encStr)
decStr := mustDecode(enc, encStr)
if decStr != str {
panic(errors.New("unequal!"))
}
}
func main() {
const testStr = "Go语言编程"
testEncoding(base64.StdEncoding, testStr)
testEncoding(base64.URLEncoding, testStr)
testEncoding(base64.RawStdEncoding, testStr)
testEncoding(base64.RawURLEncoding, testStr)
}
流式API的应用
流式API多用于在数据传输过程中对数据进行Base64编码或解码。比如在读取较大文件时,或者网络传输时。下面的程序读取testfile中的数据,利用base64编码后保存到testfile_enc:
package main
import (
"encoding/base64"
"io"
"log"
"os"
)
type Buf struct {
data []byte
size int
}
func main() {
f, err := os.Open("E:\\testfile")
if err != nil {
log.Fatalln(err)
}
defer f.Close()
fEnc, err := os.Create("E:\\testfile_enc")
if err != nil {
log.Fatalln(err)
}
defer fEnc.Close()
w := base64.NewEncoder(base64.StdEncoding, fEnc)
io.Copy(w, f)
w.Close()
}