Golang Deco Enco

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

mproto.go

package mprotoimport ("bytes""encoding/binary""fmt""reflect""strconv")const (PT_GR_LUACOMMAND        uint32 = 9299PT_GC_CLEARFACEBOOKBIND uint32 = 32689PT_GC_CLEARDEVICEBIND   uint32 = 7445PT_GR_BANDACCOUNT       uint32 = 29536)type GR_LuaCommand struct {LuaCommand string `key:"21868"`}type GC_ClearFacebookBind struct {AccountId int32 `key:"512"`}func (o *GC_ClearFacebookBind) DecoStruct(dat []byte) {buffer := bytes.NewBuffer(dat)var fKey int16var fLen int16// 取KEYfor nil == binary.Read(buffer, binary.LittleEndian, &fKey) {switch fKey {case 512:{binary.Read(buffer, binary.LittleEndian, &fLen)binary.Read(buffer, binary.LittleEndian, &o.AccountId)}break}}}type GR_BandAccount struct {//AccountId int32                  `key:"24137"`BandTime int64  `key:"23911"`Result   string `key:"27966"`NetIndex int8   `key:"11487"`NetOrder  int16                  `key:"585"`Something GC_ClearFacebookBind   `key:"1585"`Array     []GC_ClearFacebookBind `key:"1024"`}func (o *GR_BandAccount) DecoStruct(dat []byte) {buffer := bytes.NewBuffer(dat)var fKey int16var fLen int16// 取KEYfor nil == binary.Read(buffer, binary.LittleEndian, &fKey) {switch fKey {case 1024:{binary.Read(buffer, binary.LittleEndian, &fLen)f := make([]byte, fLen)binary.Read(buffer, binary.LittleEndian, &f)var aGC_ClearFacebookBind GC_ClearFacebookBind = GC_ClearFacebookBind{}aGC_ClearFacebookBind.DecoStruct(f)o.Array = append(o.Array, aGC_ClearFacebookBind)}case 1585:{binary.Read(buffer, binary.LittleEndian, &fLen)f := make([]byte, fLen)binary.Read(buffer, binary.LittleEndian, &f)var aGC_ClearFacebookBind GC_ClearFacebookBind = GC_ClearFacebookBind{}aGC_ClearFacebookBind.DecoStruct(f)o.Something = aGC_ClearFacebookBind}case 23911:{binary.Read(buffer, binary.LittleEndian, &fLen)binary.Read(buffer, binary.LittleEndian, &o.BandTime)}case 27966:{binary.Read(buffer, binary.LittleEndian, &fLen)f := make([]byte, fLen)binary.Read(buffer, binary.LittleEndian, &f)o.Result = string(f)}case 11487:{binary.Read(buffer, binary.LittleEndian, &fLen)binary.Read(buffer, binary.LittleEndian, &o.NetIndex)}case 585:{binary.Read(buffer, binary.LittleEndian, &fLen)binary.Read(buffer, binary.LittleEndian, &o.NetOrder)}}}}func EncoStructSize(o interface{}) int32 {t := reflect.TypeOf(o)v := reflect.ValueOf(o)var size int32 = 0for i := 0; i < t.NumField(); i++ {f := t.Field(i)if f.Type.Kind() == reflect.Array || f.Type.Kind() == reflect.Slice {for j := 0; j < v.Field(i).Len(); j++ {if v.Field(i).Index(j).Kind() == reflect.String {strval, _ := v.Field(i).Index(j).Interface().(string)size += int32(len([]byte(strval)))} else if v.Field(i).Index(j).Kind() == reflect.Int8 {size += 5} else if v.Field(i).Index(j).Kind() == reflect.Int16 {size += 6} else if v.Field(i).Index(j).Kind() == reflect.Int32 {size += 8} else if v.Field(i).Index(j).Kind() == reflect.Int64 {size += 12} else if v.Field(i).Index(j).Kind() == reflect.Struct {size += (EncoStructSize(v.Field(i).Index(j).Interface()))} else {fmt.Printf("nothing2 %6s: %v = %v tag:%s \n", f.Name, f.Type, v.Field(i).Index(j).Interface(), f.Tag)}}} else {if f.Type.Kind() == reflect.String {strval, _ := v.Field(i).Interface().(string)size += int32(len([]byte(strval)))} else if f.Type.Kind() == reflect.Int8 {size += 5} else if f.Type.Kind() == reflect.Int16 {size += 6} else if f.Type.Kind() == reflect.Int32 {size += 8} else if f.Type.Kind() == reflect.Int64 {size += 12} else if f.Type.Kind() == reflect.Struct {size += (EncoStructSize(v.Field(i).Interface()))} else {fmt.Printf("nothing1 %6s: %v = %v tag:%s %s\n", f.Name, f.Type, v.Field(i).Interface(), f.Tag, f.Type.Kind().String())}}}return size}func EncoStruct(o interface{}) []byte {t := reflect.TypeOf(o)v := reflect.ValueOf(o)buffer := bytes.NewBuffer([]byte{})for i := 0; i < t.NumField(); i++ {f := t.Field(i)// KEYk, _ := strconv.Atoi(f.Tag.Get("key"))if f.Type.Kind() == reflect.Array || f.Type.Kind() == reflect.Slice {for j := 0; j < v.Field(i).Len(); j++ {binary.Write(buffer, binary.LittleEndian, int16(k))if v.Field(i).Index(j).Kind() == reflect.String {strval, _ := v.Field(i).Index(j).Interface().(string)// 長度binary.Write(buffer, binary.LittleEndian, int16(len([]byte(strval))))// 內容binary.Write(buffer, binary.LittleEndian, []byte(strval))} else if v.Field(i).Index(j).Kind() == reflect.Int8 {int8val, _ := v.Field(i).Index(j).Interface().(int8)// 長度binary.Write(buffer, binary.LittleEndian, int16(1))// 內容binary.Write(buffer, binary.LittleEndian, int8(int8val))} else if v.Field(i).Index(j).Kind() == reflect.Int16 {int16val, _ := v.Field(i).Index(j).Interface().(int16)// 長度binary.Write(buffer, binary.LittleEndian, int16(2))// 內容binary.Write(buffer, binary.LittleEndian, int16(int16val))} else if v.Field(i).Index(j).Kind() == reflect.Int32 {int32val, _ := v.Field(i).Index(j).Interface().(int32)// 長度binary.Write(buffer, binary.LittleEndian, int16(4))// 內容binary.Write(buffer, binary.LittleEndian, int32(int32val))} else if v.Field(i).Index(j).Kind() == reflect.Int64 {int64val, _ := v.Field(i).Index(j).Interface().(int64)// 長度binary.Write(buffer, binary.LittleEndian, int16(8))// 內容binary.Write(buffer, binary.LittleEndian, int64(int64val))} else if v.Field(i).Index(j).Kind() == reflect.Struct {// 長度binary.Write(buffer, binary.LittleEndian, int16(EncoStructSize(v.Field(i).Index(j).Interface())))// 內容binary.Write(buffer, binary.LittleEndian, EncoStruct(v.Field(i).Index(j).Interface()))} else {fmt.Printf("nothing3 %6s: %v = %v tag:%s %s\n", f.Name, f.Type, v.Field(i).Index(j).Interface(), f.Tag, f.Type.Kind().String())}}} else {binary.Write(buffer, binary.LittleEndian, int16(k))val := v.Field(i).Interface()if f.Type.Kind() == reflect.String {strval, _ := val.(string)// 長度binary.Write(buffer, binary.LittleEndian, int16(len([]byte(strval))))// 內容binary.Write(buffer, binary.LittleEndian, []byte(strval))} else if f.Type.Kind() == reflect.Int8 {int8val, _ := val.(int8)// 長度binary.Write(buffer, binary.LittleEndian, int16(1))// 內容binary.Write(buffer, binary.LittleEndian, int8(int8val))} else if f.Type.Kind() == reflect.Int16 {int16val, _ := val.(int16)// 長度binary.Write(buffer, binary.LittleEndian, int16(2))// 內容binary.Write(buffer, binary.LittleEndian, int16(int16val))} else if f.Type.Kind() == reflect.Int32 {int32val, _ := val.(int32)// 長度binary.Write(buffer, binary.LittleEndian, int16(4))// 內容binary.Write(buffer, binary.LittleEndian, int32(int32val))} else if f.Type.Kind() == reflect.Int64 {int64val, _ := val.(int64)// 長度binary.Write(buffer, binary.LittleEndian, int16(8))// 內容binary.Write(buffer, binary.LittleEndian, int64(int64val))} else if f.Type.Kind() == reflect.Struct {// 長度binary.Write(buffer, binary.LittleEndian, int16(EncoStructSize(val)))// 內容binary.Write(buffer, binary.LittleEndian, EncoStruct(val))} else {fmt.Printf("nothing4 %6s: %v = %v tag:%s %s\n", f.Name, f.Type, val, f.Tag, f.Type.Kind().String())}}}return buffer.Bytes()}

 main.go

package mainimport ("./mproto""fmt")func main() {var gr mproto.GR_BandAccountvar gc mproto.GC_ClearFacebookBindvar t mproto.GR_BandAccount = mproto.GR_BandAccount{}gc.AccountId = 4096gr.BandTime = 111gr.Something.AccountId = 32gr.NetIndex = 4gr.NetOrder = 5gr.Result = "abc中車"gr.Array = append(gr.Array, gc)fmt.Println(gr)b := mproto.EncoStruct(gr)t.DecoStruct(b)fmt.Println(t)}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.