Golang Deco Enco
8842 단어 golang
package mproto
import (
"bytes"
"encoding/binary"
"fmt"
"reflect"
"strconv"
)
const (
PT_GR_LUACOMMAND uint32 = 9299
PT_GC_CLEARFACEBOOKBIND uint32 = 32689
PT_GC_CLEARDEVICEBIND uint32 = 7445
PT_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 int16
var fLen int16
// KEY
for 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 int16
var fLen int16
// KEY
for 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 = 0
for 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
", 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
", 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)
// KEY
k, _ := 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
", 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
", f.Name, f.Type, val, f.Tag, f.Type.Kind().String())
}
}
}
return buffer.Bytes()
}
main.go
package main
import (
"./mproto"
"fmt"
)
func main() {
var gr mproto.GR_BandAccount
var gc mproto.GC_ClearFacebookBind
var t mproto.GR_BandAccount = mproto.GR_BandAccount{}
gc.AccountId = 4096
gr.BandTime = 111
gr.Something.AccountId = 32
gr.NetIndex = 4
gr.NetOrder = 5
gr.Result = "abc "
gr.Array = append(gr.Array, gc)
fmt.Println(gr)
b := mproto.EncoStruct(gr)
t.DecoStruct(b)
fmt.Println(t)
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.