- 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()
}