?
This document uses PHP Chinese website manual Release
import "encoding/binary"
Overview
Index
Examples
軟件包二進制實現(xiàn)了數(shù)字和字節(jié)序列之間的簡單轉(zhuǎn)換以及varint的編碼和解碼。
數(shù)字通過讀取和寫入固定大小的值進行翻譯。固定大小的值可以是固定大小的算術(shù)類型(bool,int8,uint8,int16,float32,complex64,...),也可以是只包含固定大小值的數(shù)組或結(jié)構(gòu)。
varint函數(shù)使用可變長度編碼對單個整數(shù)值進行編碼和解碼; 較小的值需要較少的字節(jié)。有關(guān)規(guī)范,請參閱https://developers.google.com/protocol-buffers/docs/encoding。
此包傾向于簡化而不是效率。需要高性能序列化的客戶端,尤其是大型數(shù)據(jù)結(jié)構(gòu)的客戶端,應(yīng)該考慮更高級的解決方案,如編碼/ gob包或協(xié)議緩沖區(qū)。
Constants
Variables
func PutUvarint(buf []byte, x uint64) int
func PutVarint(buf []byte, x int64) int
func Read(r io.Reader, order ByteOrder, data interface{}) error
func ReadUvarint(r io.ByteReader) (uint64, error)
func ReadVarint(r io.ByteReader) (int64, error)
func Size(v interface{}) int
func Uvarint(buf []byte) (uint64, int)
func Varint(buf []byte) (int64, int)
func Write(w io.Writer, order ByteOrder, data interface{}) error
type ByteOrder
ByteOrder(Get)ByteOrder(Put)PutUvarint PutVarint Read Uvarint Varint Write Write(Multi)
binary.go varint.go
MaxVarintLenN是varint編碼的N位整數(shù)的最大長度。
const ( MaxVarintLen16 = 3 MaxVarintLen32 = 5 MaxVarintLen64 = 10)
BigEndian是ByteOrder的大端實現(xiàn)。
var BigEndian bigEndian
LittleEndian是ByteOrder的小端實現(xiàn)。
var LittleEndian littleEndian
func PutUvarint(buf []byte, x uint64) int
PutUvarint將uint64編碼到buf中,并返回寫入的字節(jié)數(shù)。如果緩沖區(qū)太小,PutUvarint會驚慌失措。
package mainimport ("encoding/binary""fmt")func main() { buf := make([]byte, binary.MaxVarintLen64)for _, x := range []uint64{1, 2, 127, 128, 255, 256} { n := binary.PutUvarint(buf, x) fmt.Printf("%x\n", buf[:n])}}
func PutVarint(buf []byte, x int64) int
PutVarint將int64編碼為buf并返回寫入的字節(jié)數(shù)。如果緩沖區(qū)太小,PutVarint會驚慌失措。
package mainimport ("encoding/binary""fmt")func main() { buf := make([]byte, binary.MaxVarintLen64)for _, x := range []int64{-65, -64, -2, -1, 0, 1, 2, 63, 64} { n := binary.PutVarint(buf, x) fmt.Printf("%x\n", buf[:n])}}
func Read(r io.Reader, order ByteOrder, data interface{}) error
讀取從r讀取結(jié)構(gòu)化二進制數(shù)據(jù)到數(shù)據(jù)。數(shù)據(jù)必須是指向固定大小值或固定大小值的指針。從r讀取的字節(jié)使用指定的字節(jié)順序解碼并寫入數(shù)據(jù)的連續(xù)字段。當(dāng)解碼布爾值時,零字節(jié)被解碼為假,并且任何其他非零字節(jié)被解碼為真。在讀入結(jié)構(gòu)時,跳過帶空白(_)字段名稱的字段的字段數(shù)據(jù); 即空白字段名稱可用于填充。讀入結(jié)構(gòu)時,必須導(dǎo)出所有非空白字段或讀取可能會出現(xiàn)混亂。
只有在沒有字節(jié)被讀取的情況下,錯誤才是EOF。如果在讀取一些但不是全部字節(jié)后發(fā)生EOF,則Read返回ErrUnexpectedEOF。
package mainimport ("bytes""encoding/binary""fmt")func main() {var pi float64 b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40} buf := bytes.NewReader(b) err := binary.Read(buf, binary.LittleEndian, &pi)if err != nil { fmt.Println("binary.Read failed:", err)} fmt.Print(pi)}
func ReadUvarint(r io.ByteReader) (uint64, error)
ReadUvarint從r讀取一個編碼的無符號整數(shù)并將其作為uint64返回。
func ReadVarint(r io.ByteReader) (int64, error)
ReadVarint從r中讀取一個已編碼的有符號整數(shù)并將其作為int64返回。
func Size(v interface{}) int
Size返回Write將生成的值,以便對值v進行編碼,該值必須是固定大小的值或固定大小的值片段或指向此類數(shù)據(jù)的指針。如果v不是這些,則Size返回-1。
func Uvarint(buf []byte) (uint64, int)
Uvarint從buf解碼uint64并返回該值和讀取的字節(jié)數(shù)(> 0)。如果發(fā)生錯誤,則該值為0,并且字節(jié)數(shù)n <= 0意味著:
n == 0: buf too small n < 0: value larger than 64 bits (overflow) and -n is the number of bytes read
package mainimport ("encoding/binary""fmt")func main() { inputs := [][]byte{[]byte{0x01},[]byte{0x02},[]byte{0x7f},[]byte{0x80, 0x01},[]byte{0xff, 0x01},[]byte{0x80, 0x02},}for _, b := range inputs { x, n := binary.Uvarint(b)if n != len(b) { fmt.Println("Uvarint did not consume all of in")} fmt.Println(x)}}
func Varint(buf []byte) (int64, int)
Varint從buf解碼int64并返回該值和讀取的字節(jié)數(shù)(> 0)。如果發(fā)生錯誤,則值為0,并且字節(jié)數(shù)n <= 0,其含義如下:
n == 0: buf too small n < 0: value larger than 64 bits (overflow) and -n is the number of bytes read
package mainimport ("encoding/binary""fmt")func main() { inputs := [][]byte{[]byte{0x81, 0x01},[]byte{0x7f},[]byte{0x03},[]byte{0x01},[]byte{0x00},[]byte{0x02},[]byte{0x04},[]byte{0x7e},[]byte{0x80, 0x01},}for _, b := range inputs { x, n := binary.Varint(b)if n != len(b) { fmt.Println("Varint did not consume all of in")} fmt.Println(x)}}
func Write(w io.Writer, order ByteOrder, data interface{}) error
寫將數(shù)據(jù)的二進制表示寫入w。數(shù)據(jù)必須是固定大小的值或固定大小的值片段,或指向這些數(shù)據(jù)的指針。布爾值編碼為一個字節(jié):1為真,0為假。寫入w的字節(jié)使用指定的字節(jié)順序進行編碼,并從數(shù)據(jù)的連續(xù)字段中讀取。在編寫結(jié)構(gòu)時,將為具有空白(_)字段名稱的字段寫入零值。
package mainimport ("bytes""encoding/binary""fmt""math")func main() { buf := new(bytes.Buffer)var pi float64 = math.Pi err := binary.Write(buf, binary.LittleEndian, pi)if err != nil { fmt.Println("binary.Write failed:", err)} fmt.Printf("% x", buf.Bytes())}
package mainimport ("bytes""encoding/binary""fmt")func main() { buf := new(bytes.Buffer)var data = []interface{}{uint16(61374),int8(-54),uint8(254),}for _, v := range data { err := binary.Write(buf, binary.LittleEndian, v)if err != nil { fmt.Println("binary.Write failed:", err)}} fmt.Printf("%x", buf.Bytes())}
ByteOrder指定如何將字節(jié)序列轉(zhuǎn)換為16,32或64位無符號整數(shù)。
type ByteOrder interface { Uint16([]byte) uint16 Uint32([]byte) uint32 Uint64([]byte) uint64 PutUint16([]byte, uint16) PutUint32([]byte, uint32) PutUint64([]byte, uint64) String() string}
package mainimport ("encoding/binary""fmt")func main() { b := []byte{0xe8, 0x03, 0xd0, 0x07} x1 := binary.LittleEndian.Uint16(b[0:]) x2 := binary.LittleEndian.Uint16(b[2:]) fmt.Printf("%#04x %#04x\n", x1, x2)}
package mainimport ("encoding/binary""fmt")func main() { b := make([]byte, 4) binary.LittleEndian.PutUint16(b[0:], 0x03e8) binary.LittleEndian.PutUint16(b[2:], 0x07d0) fmt.Printf("% x\n", b)}