Golang標(biāo)準(zhǔn)庫——encoding(1)

  • encoding
  • ascii85
  • asn1
  • base32
  • base64

encoding

encoding包定義了供其它包使用的可以將數(shù)據(jù)在字節(jié)水平和文本表示之間轉(zhuǎn)換的接口。encoding/gob鸭津、encoding/json蚯舱、encoding/xml三個包都會檢查使用這些接口。因此佩憾,只要實(shí)現(xiàn)了這些接口一次哮伟,就可以在多個包里使用。標(biāo)準(zhǔn)包內(nèi)建類型time.Time和net.IP都實(shí)現(xiàn)了這些接口妄帘。接口是成對的楞黄,分別產(chǎn)生和還原編碼后的數(shù)據(jù)。

type BinaryMarshaler

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

實(shí)現(xiàn)了BinaryMarshaler接口的類型可以將自身序列化為binary格式抡驼。

type BinaryUnmarshaler

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

實(shí)現(xiàn)了BinaryUnmarshaler接口的類型可以將binary格式表示的自身解序列化鬼廓。

UnmarshalBinary必須可以解碼MarshalBinary生成的binary格式數(shù)據(jù)。本函數(shù)可能會對data內(nèi)容作出修改致盟,所以如果要保持data的數(shù)據(jù)請事先進(jìn)行拷貝碎税。

type TextMarshaler

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

實(shí)現(xiàn)了BinaryMarshaler接口的類型可以將自身序列化為utf-8編碼的textual格式尤慰。

type TextUnmarshaler

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

實(shí)現(xiàn)了TextUnmarshaler接口的類型可以將textual格式表示的自身解序列化。

UnmarshalText必須可以解碼MarshalText生成的textual格式數(shù)據(jù)雷蹂。本函數(shù)可能會對data內(nèi)容作出修改伟端,所以如果要保持data的數(shù)據(jù)請事先進(jìn)行拷貝。

ascii85

ascii85包實(shí)現(xiàn)了ascii85數(shù)據(jù)編碼(5個ascii字符表示4個字節(jié))萎河,該編碼用于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字節(jié)源數(shù)據(jù)編碼后的最大字節(jié)數(shù)。

func Encode

func Encode(dst, src []byte) int

將src編碼成最多MaxEncodedLen(len(src))數(shù)據(jù)寫入dst虐杯,返回實(shí)際寫入的字節(jié)數(shù)玛歌。編碼每4字節(jié)一段進(jìn)行一次,最后一個片段采用特殊的處理方式擎椰,因此不應(yīng)將本函數(shù)用于處理大數(shù)據(jù)流的某一獨(dú)立數(shù)據(jù)塊支子。

一般來說ascii85編碼數(shù)據(jù)會被'<'和'>'包括起來,函數(shù)并未添加上它們达舒。

func Decode

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

將src解碼后寫入dst值朋,返回寫入dst的字節(jié)數(shù)、從src解碼的字節(jié)數(shù)巩搏。如果src含有非法數(shù)據(jù)昨登,函數(shù)將返回成功執(zhí)行的數(shù)據(jù)(兩個數(shù)字)和CorruptInputError。如果flush為真贯底,則函數(shù)會認(rèn)為src代表輸入流的結(jié)尾丰辣,完全處理src,而不會等待另一個32字節(jié)的數(shù)據(jù)塊禽捆。

函數(shù)會忽略src中的空格和控制字符笙什,一般來說ascii85編碼數(shù)據(jù)會被'<'和'>'包括起來,但是調(diào)用者應(yīng)自行去掉它們胚想。

func NewEncoder

func NewEncoder(w io.Writer) io.WriteCloser

創(chuàng)建一個將數(shù)據(jù)編碼為ascii85流寫入w的編碼器琐凭。Ascii85編碼算法操作32位塊,寫入結(jié)束后浊服,必須調(diào)用Close方法將緩存中保留的不完整塊刷新到w里统屈。

func NewDecoder

func NewDecoder(r io.Reader) io.Reader

創(chuàng)建一個從r解碼ascii85流的解碼器。

asn1

asn1包實(shí)現(xiàn)了DER編碼的ASN.1數(shù)據(jù)結(jié)構(gòu)的解析牙躺,參見ITU-T Rec X.690鸿吆。

其他細(xì)節(jié)參見"A Layman's Guide to a Subset of ASN.1, BER, and DER"。

type SyntaxError

type SyntaxError struct {
    Msg string
}

SyntaxErrorLeixing表示ASN.1數(shù)據(jù)不合法述呐。

func (SyntaxError) Error

func (e SyntaxError) Error() string

type StructuralError

type StructuralError struct {
    Msg string
}

StructuralError表示ASN.1數(shù)據(jù)合法但接收的Go類型不匹配。

func (StructuralError) Error

func (e StructuralError) Error() string

type RawContent

type RawContent []byte

RawContent用于標(biāo)記未解碼的應(yīng)被結(jié)構(gòu)體保留的DER數(shù)據(jù)蕉毯。如要使用它乓搬,結(jié)構(gòu)體的第一個字段必須是本類型思犁,其它字段不能是本類型。

type RawValue

type RawValue struct {
    Class, Tag int
    IsCompound bool
    Bytes      []byte
    FullBytes  []byte // 包括標(biāo)簽和長度
}

RawValue代表一個未解碼的ASN.1對象进肯。

type Flag

type Flag bool

Flag接收任何數(shù)據(jù)激蹲,如果數(shù)據(jù)存在就設(shè)自身為真。

type Enumerated

type Enumerated int

Enumerated表示一個明文整數(shù)江掩。

type BitString

type BitString struct {
    Bytes     []byte // 字位流打包在字節(jié)流里
    BitLength int    // 字位流的長度
}

BitString類型是用于表示ASN.1 BIT STRING類型的結(jié)構(gòu)體学辱。字位流補(bǔ)齊到最近的字節(jié)數(shù)保存在內(nèi)存里并記錄合法字位數(shù),補(bǔ)齊的位可以為0個环形。

func (BitString) At

func (b BitString) At(i int) int

At方法發(fā)揮index位置的字位策泣,如果index出界則返回0。

func (BitString) RightAlign

func (b BitString) RightAlign() []byte

RightAlign方法返回b表示的字位流的右對齊版本(即補(bǔ)位在開始部分)切片抬吟,該切片可能和b共享底層內(nèi)存萨咕。

type ObjectIdentifier

type ObjectIdentifier []int

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

func (ObjectIdentifier) Equal

func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool

如果oi和other代表同一個標(biāo)識符火本,Equal方法返回真危队。

func (ObjectIdentifier) String

func (oi ObjectIdentifier) String() string

func Marshal

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

Marshal函數(shù)返回val的ASN.1編碼。

此外還提供了供Unmarshal函數(shù)識別的結(jié)構(gòu)體標(biāo)簽钙畔,可用如下標(biāo)簽:

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函數(shù)解析DER編碼的ASN.1結(jié)構(gòu)體數(shù)據(jù)并使用reflect包填寫val指向的任意類型值茫陆。因?yàn)楸竞瘮?shù)使用了reflect包,結(jié)構(gòu)體必須使用大寫字母起始的字段名擎析。

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{}類型。保存在接口里的類型為對應(yīng)的Go類型蔓肯,ASN.1整型對應(yīng)int64遂鹊。

如果類型x可以寫入切片的成員類型,則類型x的ASN.1 SEQUENCE或SET類型可以寫入該切片蔗包。

ASN.1 SEQUENCE或SET類型如果其每一個成員都可以寫入某結(jié)構(gòu)體的對應(yīng)字段秉扑,則可以寫入該結(jié)構(gòu)體

對Unmarshal函數(shù),下列字段標(biāo)簽有特殊含義:

application    指明使用了APPLICATION標(biāo)簽
default:x      設(shè)置一個可選整數(shù)字段的默認(rèn)值
explicit       給一個隱式的標(biāo)簽設(shè)置一個額外的顯式標(biāo)簽
optional       標(biāo)記字段為ASN.1 OPTIONAL的
set            表示期望一個SET而不是SEQUENCE類型
tag:x          指定ASN.1標(biāo)簽碼,隱含ASN.1 CONTEXT SPECIFIC

如果結(jié)構(gòu)體的第一個字段的類型為RawContent舟陆,則會將原始ASN1結(jié)構(gòu)體內(nèi)容包存在該字段误澳。

如果切片成員的類型名以"SET"結(jié)尾,則視為該字段有"set"標(biāo)簽秦躯。這是給不能使用標(biāo)簽的嵌套切片使用的忆谓。

其它ASN.1類型不支持,如果遭遇這些類型踱承,Unmarshal返回解析錯誤倡缠。

func UnmarshalWithParams

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

UnmarshalWithParams允許指定val頂層成員的字段參數(shù),格式和字段標(biāo)簽相同茎活。

base32

base32包實(shí)現(xiàn)了RFC 4648規(guī)定的base32編碼昙沦。

Variables

var HexEncoding = NewEncoding(encodeHex)

RFC 4648定義的“擴(kuò)展Hex字符集”,用于DNS妙色。

var StdEncoding = NewEncoding(encodeStd)

RFC 4648定義的標(biāo)準(zhǔn)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
}

雙向的編碼/解碼協(xié)議,根據(jù)一個32字符的字符集定義身辨,RFC 4648標(biāo)準(zhǔn)化了兩種字符集丐谋。默認(rèn)字符集用于SASI和GSSAPI,另一種用于DNSSEC煌珊。

func NewEncoding

func NewEncoding(encoder string) *Encoding

使用給出的字符集生成一個*Encoding号俐,字符集必須是32字節(jié)的字符串。

func (*Encoding) DecodedLen

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

返回n字節(jié)base32編碼的數(shù)據(jù)解碼后的最大長度定庵。

func (*Encoding) Decode

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

將src的數(shù)據(jù)解碼后存入dst吏饿,最多寫DecodedLen(len(src))字節(jié)數(shù)據(jù)到dst,并返回寫入的字節(jié)數(shù)蔬浙。如果src包含非法字符猪落,將返回成功寫入的字符數(shù)和CorruptInputError。換行符(\r畴博、\n)會被忽略笨忌。

func (*Encoding) DecodeString

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

返回base32編碼的字符串s代表的數(shù)據(jù)。

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字節(jié)數(shù)據(jù)進(jìn)行base32編碼后的最大長度俱病。

func (*Encoding) Encode

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

將src的數(shù)據(jù)編碼后存入dst官疲,最多寫EncodedLen(len(src))字節(jié)數(shù)據(jù)到dst,并返回寫入的字節(jié)數(shù)亮隙。

函數(shù)會把輸出設(shè)置為8的倍數(shù)途凫,因此不建議對大數(shù)據(jù)流的獨(dú)立數(shù)據(jù)塊執(zhí)行此方法,使用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

創(chuàng)建一個新的base32流解碼器。

func NewEncoder

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

創(chuàng)建一個新的base32流編碼器。寫入的數(shù)據(jù)會在編碼后再寫入w犀盟,base32編碼每5字節(jié)執(zhí)行一次編碼操作噪漾;寫入完畢后,使用者必須調(diào)用Close方法以便將未寫入的數(shù)據(jù)從緩存中刷新到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實(shí)現(xiàn)了RFC 4648規(guī)定的base64編碼。

Variables

var StdEncoding = NewEncoding(encodeStd)

RFC 4648定義的標(biāo)準(zhǔn)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
}

雙向的編碼/解碼協(xié)議豹障,根據(jù)一個64字符的字符集定義冯事,RFC 4648標(biāo)準(zhǔn)化了兩種字符集。默認(rèn)字符集用于MIME(RFC 2045)和PEM(RFC 1421)編碼血公;另一種用于URL和文件名昵仅,用'-'和'_'替換了'+'和'/'。

func NewEncoding

func NewEncoding(encoder string) *Encoding

使用給出的字符集生成一個*Encoding累魔,字符集必須是64字節(jié)的字符串摔笤。

func (*Encoding) DecodedLen

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

返回n字節(jié)base64編碼的數(shù)據(jù)解碼后的最大長度。

func (*Encoding) Decode

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

將src的數(shù)據(jù)解碼后存入dst垦写,最多寫DecodedLen(len(src))字節(jié)數(shù)據(jù)到dst吕世,并返回寫入的字節(jié)數(shù)。 如果src包含非法字符梯投,將返回成功寫入的字符數(shù)和CorruptInputError。換行符(\r、\n)會被忽略导犹。

func (*Encoding) DecodeString

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

返回base64編碼的字符串s代表的數(shù)據(jù)裹赴。

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字節(jié)數(shù)據(jù)進(jìn)行base64編碼后的最大長度。

func (*Encoding) Encode

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

將src的數(shù)據(jù)編碼后存入dst么鹤,最多寫EncodedLen(len(src))字節(jié)數(shù)據(jù)到dst终娃,并返回寫入的字節(jié)數(shù)。

函數(shù)會把輸出設(shè)置為4的倍數(shù)午磁,因此不建議對大數(shù)據(jù)流的獨(dú)立數(shù)據(jù)塊執(zhí)行此方法尝抖,使用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

創(chuàng)建一個新的base64流解碼器昧辽。

func NewEncoder

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

創(chuàng)建一個新的base64流編碼器。寫入的數(shù)據(jù)會在編碼后再寫入w登颓,base32編碼每3字節(jié)執(zhí)行一次編碼操作搅荞;寫入完畢后,使用者必須調(diào)用Close方法以便將未寫入的數(shù)據(jù)從緩存中刷新到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()
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咕痛,一起剝皮案震驚了整個濱河市痢甘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茉贡,老刑警劉巖塞栅,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腔丧,居然都是意外死亡放椰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門愉粤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砾医,“玉大人,你說我怎么就攤上這事衣厘∪缪粒” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵影暴,是天一觀的道長错邦。 經(jīng)常有香客問我,道長坤检,這世上最難降的妖魔是什么兴猩? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮早歇,結(jié)果婚禮上倾芝,老公的妹妹穿的比我還像新娘。我一直安慰自己箭跳,他們只是感情好晨另,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谱姓,像睡著了一般借尿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屉来,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天路翻,我揣著相機(jī)與錄音,去河邊找鬼茄靠。 笑死茂契,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慨绳。 我是一名探鬼主播掉冶,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼真竖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厌小?” 一聲冷哼從身側(cè)響起恢共,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璧亚,沒想到半個月后讨韭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡癣蟋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年拐袜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梢薪。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尝哆,靈堂內(nèi)的尸體忽然破棺而出秉撇,到底是詐尸還是另有隱情,我是刑警寧澤秋泄,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布琐馆,位于F島的核電站,受9級特大地震影響恒序,放射性物質(zhì)發(fā)生泄漏瘦麸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一歧胁、第九天 我趴在偏房一處隱蔽的房頂上張望滋饲。 院中可真熱鬧,春花似錦喊巍、人聲如沸屠缭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呵曹。三九已至,卻和暖如春何暮,著一層夾襖步出監(jiān)牢的瞬間奄喂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工海洼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跨新,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓贰军,卻偏偏與公主長得像玻蝌,于是被迫代替她去往敵國和親蟹肘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350