這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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)}