mproto.go

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 \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) // 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\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 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)
}

Golang Deco Enco的更多相关文章

  1. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  2. 说说Golang的使用心得

    13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直 ...

  3. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  4. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  5. golang struct扩展函数参数命名警告

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...

  6. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  7. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  8. golang的安装

    整理了一下,网上关于golang的安装有三种方式(注明一下,我的环境为CentOS-6.x, 64bit) 方式一:yum安装(最简单) rpm -Uvh http://dl.fedoraprojec ...

  9. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

随机推荐

  1. for循环练习——7月23日

    练习一:输入一个整数,求从1到这个数的累加和 //练习1:输入一个整数,计算从1加到这个数的结果 Console.Write("请输入一个正整数:"); int a = int.P ...

  2. [转]Java8-本地缓存

    这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值.非常完美的实现cach ...

  3. mongodb 和 mysql 的对照

    In addition to the charts that follow, you might want to consider the Frequently Asked Questions sec ...

  4. mysql在一台服务器搭建主从

    注:本环境事先执行rm -rf /usr/local/mysql   以方便实验. 1. 主与从,类似于A机器和B机器的连接,通过bin_log和rpel_log 进行数据连接 2. 如图所示: 3. ...

  5. 让你的WPF程序使用多线程——BackgroundWorker

    在wpf中可以使用许多方法执行异步操作.利用.NET的芳芳就是手动创建一个新的System.Threading.Thread对象,提供一步代码,并使用THread.Start()方法加载代码.这种方法 ...

  6. web开发-服务器Controller到前端中的数据传递

    一, ajax方式 (一)controller中 1. 定义AjaxResponse类 成员有: status , message, data.  其中 status是成功或失败状态, message ...

  7. [css3]搜索框focus时变长

    结构: <form class="demo-a">    <input placeholder="Search" type="sea ...

  8. CSS3卷角

    众所周知,border-radius 属性可以用来设置圆角,但很少人知道它还可以做很多不规则的犄角.卷角(rounded corners) 工作原理: 一.独立属性:border-bottom-lef ...

  9. hdu 4619 Warm up 2

    http://acm.hdu.edu.cn/showproblem.php?pid=4619 根据题意可知,每一个方格可能只被一个骨牌覆盖 可能被两个骨牌覆盖 也可能不被覆盖 有一个骨牌覆盖的方格(单 ...

  10. 【STL】-list的用法

    初始化: #include <list> list<char> clist; 算法: clist.push_back(c); clist.remove('d'); 代码: #i ...