Golang标准库——encoding(1)

DevilRoshan · · 1102 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

  • encoding
  • ascii85
  • asn1
  • base32
  • base64

encoding

encoding包定义了供其它包使用的可以将数据在字节水平和文本表示之间转换的接口。encoding/gob、encoding/json、encoding/xml三个包都会检查使用这些接口。因此,只要实现了这些接口一次,就可以在多个包里使用。标准包内建类型time.Time和net.IP都实现了这些接口。接口是成对的,分别产生和还原编码后的数据。

type BinaryMarshaler

type BinaryMarshaler interface {
    MarshalBinary() (data []byte, err error)
}

实现了BinaryMarshaler接口的类型可以将自身序列化为binary格式。

type BinaryUnmarshaler

type BinaryUnmarshaler interface {
    UnmarshalBinary(data []byte) error
}

实现了BinaryUnmarshaler接口的类型可以将binary格式表示的自身解序列化。

UnmarshalBinary必须可以解码MarshalBinary生成的binary格式数据。本函数可能会对data内容作出修改,所以如果要保持data的数据请事先进行拷贝。

type TextMarshaler

type TextMarshaler interface {
    MarshalText() (text []byte, err error)
}

实现了BinaryMarshaler接口的类型可以将自身序列化为utf-8编码的textual格式。

type TextUnmarshaler

type TextUnmarshaler interface {
    UnmarshalText(text []byte) error
}

实现了TextUnmarshaler接口的类型可以将textual格式表示的自身解序列化。

UnmarshalText必须可以解码MarshalText生成的textual格式数据。本函数可能会对data内容作出修改,所以如果要保持data的数据请事先进行拷贝。

ascii85

ascii85包实现了ascii85数据编码(5个ascii字符表示4个字节),该编码用于btoa工具和Adobe的PostScript语言和PDF文档格式。

type CorruptInputError

type CorruptInputError int64

func (CorruptInputError) Error

func (e CorruptInputError) Error() string

func MaxEncodedLen

func MaxEncodedLen(n int) int

返回n字节源数据编码后的最大字节数。

func Encode

func Encode(dst, src []byte) int

将src编码成最多MaxEncodedLen(len(src))数据写入dst,返回实际写入的字节数。编码每4字节一段进行一次,最后一个片段采用特殊的处理方式,因此不应将本函数用于处理大数据流的某一独立数据块。

一般来说ascii85编码数据会被'<'和'>'包括起来,函数并未添加上它们。

func Decode

func Decode(dst, src []byte, flush bool) (ndst, nsrc int, err error)

将src解码后写入dst,返回写入dst的字节数、从src解码的字节数。如果src含有非法数据,函数将返回成功执行的数据(两个数字)和CorruptInputError。如果flush为真,则函数会认为src代表输入流的结尾,完全处理src,而不会等待另一个32字节的数据块。

函数会忽略src中的空格和控制字符,一般来说ascii85编码数据会被'<'和'>'包括起来,但是调用者应自行去掉它们。

func NewEncoder

func NewEncoder(w io.Writer) io.WriteCloser

创建一个将数据编码为ascii85流写入w的编码器。Ascii85编码算法操作32位块,写入结束后,必须调用Close方法将缓存中保留的不完整块刷新到w里。

func NewDecoder

func NewDecoder(r io.Reader) io.Reader

创建一个从r解码ascii85流的解码器。

asn1

asn1包实现了DER编码的ASN.1数据结构的解析,参见ITU-T Rec X.690。

其他细节参见"A Layman's Guide to a Subset of ASN.1, BER, and DER"。

type SyntaxError

type SyntaxError struct {
    Msg string
}

SyntaxErrorLeixing表示ASN.1数据不合法。

func (SyntaxError) Error

func (e SyntaxError) Error() string

type StructuralError

type StructuralError struct {
    Msg string
}

StructuralError表示ASN.1数据合法但接收的Go类型不匹配。

func (StructuralError) Error

func (e StructuralError) Error() string

type RawContent

type RawContent []byte

RawContent用于标记未解码的应被结构体保留的DER数据。如要使用它,结构体的第一个字段必须是本类型,其它字段不能是本类型。

type RawValue

type RawValue struct {
    Class, Tag int
    IsCompound bool
    Bytes      []byte
    FullBytes  []byte // 包括标签和长度
}

RawValue代表一个未解码的ASN.1对象。

type Flag

type Flag bool

Flag接收任何数据,如果数据存在就设自身为真。

type Enumerated

type Enumerated int

Enumerated表示一个明文整数。

type BitString

type BitString struct {
    Bytes     []byte // 字位流打包在字节流里
    BitLength int    // 字位流的长度
}

BitString类型是用于表示ASN.1 BIT STRING类型的结构体。字位流补齐到最近的字节数保存在内存里并记录合法字位数,补齐的位可以为0个。

func (BitString) At

func (b BitString) At(i int) int

At方法发挥index位置的字位,如果index出界则返回0。

func (BitString) RightAlign

func (b BitString) RightAlign() []byte

RightAlign方法返回b表示的字位流的右对齐版本(即补位在开始部分)切片,该切片可能和b共享底层内存。

type ObjectIdentifier

type ObjectIdentifier []int

ObjectIdentifier类型用于表示ASN.1 OBJECT IDENTIFIER类型。

func (ObjectIdentifier) Equal

func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool

如果oi和other代表同一个标识符,Equal方法返回真。

func (ObjectIdentifier) String

func (oi ObjectIdentifier) String() string

func Marshal

func Marshal(val interface{}) ([]byte, error)

Marshal函数返回val的ASN.1编码。

此外还提供了供Unmarshal函数识别的结构体标签,可用如下标签:

ia5:           使字符串序列化为ASN.1 IA5String类型
omitempty:     使空切片被跳过
printable:     使字符串序列化为ASN.1 PrintableString类型
utf8:          使字符串序列化为ASN.1 UTF8字符串

func Unmarshal

func Unmarshal(b []byte, val interface{}) (rest []byte, err error)

Unmarshal函数解析DER编码的ASN.1结构体数据并使用reflect包填写val指向的任意类型值。因为本函数使用了reflect包,结构体必须使用大写字母起始的字段名。

ASN.1 INTEGER 类型值可以写入int、int32、int64或*big.Int(math/big包)类型。类型不匹配会返回解析错误。

ASN.1 BIT STRING类型值可以写入BitString类型。

ASN.1 OCTET STRING类型值可以写入[]byte类型。

ASN.1 OBJECT IDENTIFIER类型值可以写入ObjectIdentifier类型。

ASN.1 ENUMERATED类型值可以写入Enumerated类型。

ASN.1 UTCTIME类型值或GENERALIZEDTIME 类型值可以写入time.Time类型。

ASN.1 PrintableString类型值或者IA5String类型值可以写入string类型。

以上任一ASN.1类型值都可写入interface{}类型。保存在接口里的类型为对应的Go类型,ASN.1整型对应int64。

如果类型x可以写入切片的成员类型,则类型x的ASN.1 SEQUENCE或SET类型可以写入该切片。

ASN.1 SEQUENCE或SET类型如果其每一个成员都可以写入某结构体的对应字段,则可以写入该结构体

对Unmarshal函数,下列字段标签有特殊含义:

application    指明使用了APPLICATION标签
default:x      设置一个可选整数字段的默认值
explicit       给一个隐式的标签设置一个额外的显式标签
optional       标记字段为ASN.1 OPTIONAL的
set            表示期望一个SET而不是SEQUENCE类型
tag:x          指定ASN.1标签码,隐含ASN.1 CONTEXT SPECIFIC

如果结构体的第一个字段的类型为RawContent,则会将原始ASN1结构体内容包存在该字段。

如果切片成员的类型名以"SET"结尾,则视为该字段有"set"标签。这是给不能使用标签的嵌套切片使用的。

其它ASN.1类型不支持,如果遭遇这些类型,Unmarshal返回解析错误。

func UnmarshalWithParams

func UnmarshalWithParams(b []byte, val interface{}, params string) (rest []byte, err error)

UnmarshalWithParams允许指定val顶层成员的字段参数,格式和字段标签相同。

base32

base32包实现了RFC 4648规定的base32编码。

Variables

var HexEncoding = NewEncoding(encodeHex)

RFC 4648定义的“扩展Hex字符集”,用于DNS。

var StdEncoding = NewEncoding(encodeStd)

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

type CorruptInputError

type CorruptInputError int64

func (CorruptInputError) Error

func (e CorruptInputError) Error() string

type Encoding

type Encoding struct {
    encode    [32]byte
    decodeMap [256]byte
    padChar   rune
}

双向的编码/解码协议,根据一个32字符的字符集定义,RFC 4648标准化了两种字符集。默认字符集用于SASI和GSSAPI,另一种用于DNSSEC。

func NewEncoding

func NewEncoding(encoder string) *Encoding

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

func (*Encoding) DecodedLen

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

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

func (*Encoding) Decode

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

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

func (*Encoding) DecodeString

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

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

func main() {

    str := "ONXW2ZJAMRQXIYJAO5UXI2BAAAQGC3TEEDX3XPY="
    data, err := base32.StdEncoding.DecodeString(str)
    if err != nil {
        fmt.Println("error:", err)
        return
    }
    fmt.Printf("%q\n", data)
}

func (*Encoding) EncodedLen

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

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

func (*Encoding) Encode

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

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

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

func (*Encoding) EncodeToString

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

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

func main() {
    data := []byte("any + old & data")
    str := base32.StdEncoding.EncodeToString(data)
    fmt.Println(str)
}

func NewDecoder

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

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

func NewEncoder

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

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

func main() {
    input := []byte("foo\x00bar")
    encoder := base32.NewEncoder(base32.StdEncoding, os.Stdout)
    encoder.Write(input)
    // Must close the encoder when finished to flush any partial blocks.
    // If you comment out the following line, the last partial block "r"
    // won't be encoded.
    encoder.Close()
}

base64

base64实现了RFC 4648规定的base64编码。

Variables

var StdEncoding = NewEncoding(encodeStd)

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

var URLEncoding = NewEncoding(encodeURL)

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

type CorruptInputError

type CorruptInputError int64

func (CorruptInputError) Error

func (e CorruptInputError) Error() string

type Encoding

type Encoding struct {
    encode    [64]byte
    decodeMap [256]byte
    padChar   rune
    strict    bool
}

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

func NewEncoding

func NewEncoding(encoder string) *Encoding

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

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)会被忽略。

func (*Encoding) DecodeString

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

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

func main() {
    str := "c29tZSBkYXRhIHdpdGggACBhbmQg77u/"
    data, err := base64.StdEncoding.DecodeString(str)
    if err != nil {
        fmt.Println("error:", err)
        return
    }
    fmt.Printf("%q\n", data)
}

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()代替。

func (*Encoding) EncodeToString

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

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

func main() {
    data := []byte("any + old & data")
    str := base64.StdEncoding.EncodeToString(data)
    fmt.Println(str)
}

func NewDecoder

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

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

func NewEncoder

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

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

func main() {
    input := []byte("foo\x00bar")
    encoder := base64.NewEncoder(base64.StdEncoding, os.Stdout)
    encoder.Write(input)
    // Must close the encoder when finished to flush any partial blocks.
    // If you comment out the following line, the last partial block "r"
    // won't be encoded.
    encoder.Close()
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:DevilRoshan

查看原文:Golang标准库——encoding(1)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1102 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传