gf框架之gbinary - 二进制数据操作模块
文章来源:http://gf.johng.cn/500342 gf框架提供了独立的二进制数据操作包gbinary,主要用于各种数据类型与[ ]byte二进制类型之间的相互转换;以及针对于整型数据进行精准按位处理的功能。常用于网络通信时数据编码/解码,以及数据文件操作时的编码/解码。 用于二进制数据结构转换处理的方法列表如下: func Encode(vs ...interface{}) ([]byte,error) func EncodeInt(i int) []byte func EncodeInt8(i int8) []byte func EncodeInt16(i int16) []byte func EncodeInt32(i int32) []byte func EncodeInt64(i int64) []byte func EncodeUint(i uint) []byte func EncodeUint8(i uint8) []byte func EncodeUint16(i uint16) []byte func EncodeUint32(i uint32) []byte func EncodeUint64(i uint64) []byte func EncodeBool(b bool) []byte func EncodeFloat32(f float32) []byte func EncodeFloat64(f float64) []byte func EncodeString(s string) []byte func Decode(b []byte,vs ...interface{}) error func DecodeToInt(b []byte) int func DecodeToInt8(b []byte) int8 func DecodeToInt16(b []byte) int16 func DecodeToInt32(b []byte) int32 func DecodeToInt64(b []byte) int64 func DecodeToUint(b []byte) uint func DecodeToUint8(b []byte) uint8 func DecodeToUint16(b []byte) uint16 func DecodeToUint32(b []byte) uint32 func DecodeToUint64(b []byte) uint64 func DecodeToBool(b []byte) bool func DecodeToFloat32(b []byte) float32 func DecodeToFloat64(b []byte) float64 func DecodeToString(b []byte) string 支持按位处理的方法列表如下: func EncodeBits(bits []Bit,i int,l int) []Bit func EncodeBitsWithUint(bits []Bit,ui uint,l int) []Bit func EncodeBitsToBytes(bits []Bit) []byte func DecodeBits(bits []Bit) uint func DecodeBitsToUint(bits []Bit) uint func DecodeBytesToBits(bs []byte) []Bit 其中的Bit类型表示一个二进制数字(0或1),其定义如下: type Bit int8 二进制操作示例我们来看一个比较完整的二进制操作示例,基本演示了绝大部分的二进制转换操作。 gitee.com/johng/gf/blob/master/geg/encoding/gbinary/binary.go package main import ( "fmt" "gitee.com/johng/gf/g/os/glog" "gitee.com/johng/gf/g/encoding/gbinary" ) func main() { // 使用gbinary.Encoded对基本数据类型进行二进制打包 if buffer,err := gbinary.Encode(18,300,1.01); err != nil { glog.Error(err) } else { fmt.Println(buffer) } // 使用gbinary.Decode对整形二进制解包,注意第二个及其后参数为字长确定的整形变量的指针地址,字长确定的类型, // 例如:int8/16/32/64、uint8/16/32/64、float32/64 // 这里的1.01默认为float64类型(64位系统下) if buffer,1.01); err != nil { glog.Error(err) } else { var i1 int8 var i2 int16 var f3 float64 if err := gbinary.Decode(buffer,&i1,&i2,&f3); err != nil { glog.Error(err) } else { fmt.Println(i1,i2,f3) } } // 编码/解析 int,自动识别变量长度 fmt.Println(gbinary.DecodeToInt(gbinary.EncodeInt(1))) fmt.Println(gbinary.DecodeToInt(gbinary.EncodeInt(300))) fmt.Println(gbinary.DecodeToInt(gbinary.EncodeInt(70000))) fmt.Println(gbinary.DecodeToInt(gbinary.EncodeInt(2000000000))) fmt.Println(gbinary.DecodeToInt(gbinary.EncodeInt(500000000000))) // 编码/解析 uint,自动识别变量长度 fmt.Println(gbinary.DecodeToUint(gbinary.EncodeUint(1))) fmt.Println(gbinary.DecodeToUint(gbinary.EncodeUint(300))) fmt.Println(gbinary.DecodeToUint(gbinary.EncodeUint(70000))) fmt.Println(gbinary.DecodeToUint(gbinary.EncodeUint(2000000000))) fmt.Println(gbinary.DecodeToUint(gbinary.EncodeUint(500000000000))) // 编码/解析 int8/16/32/64 fmt.Println(gbinary.DecodeToInt8(gbinary.EncodeInt8(int8(100)))) fmt.Println(gbinary.DecodeToInt16(gbinary.EncodeInt16(int16(100)))) fmt.Println(gbinary.DecodeToInt32(gbinary.EncodeInt32(int32(100)))) fmt.Println(gbinary.DecodeToInt64(gbinary.EncodeInt64(int64(100)))) // 编码/解析 uint8/16/32/64 fmt.Println(gbinary.DecodeToUint8(gbinary.EncodeUint8(uint8(100)))) fmt.Println(gbinary.DecodeToUint16(gbinary.EncodeUint16(uint16(100)))) fmt.Println(gbinary.DecodeToUint32(gbinary.EncodeUint32(uint32(100)))) fmt.Println(gbinary.DecodeToUint64(gbinary.EncodeUint64(uint64(100)))) // 编码/解析 string fmt.Println(gbinary.DecodeToString(gbinary.EncodeString("I'm string!"))) } 以上程序执行结果为: [18 44 1 41 92 143 194 245 40 240 63] 18 300 1.01 1 300 70000 2000000000 500000000000 1 300 70000 2000000000 500000000000 100 100 100 100 100 100 100 100 I'm string!
按位操作处理示例gbinary的Bits相关操作简化了底层二进制位操作的复杂度,为精准的数据按位处理提供了可能。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |