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. HTML第一部分

    HTML      内容(hyper text  markup language,超文本标记语言) CSS        网页美化 Javacript 脚本语言 第一部分 HTML <html ...

  2. SerialPort使用

    1.简介随 着USB的流行,串口通讯已经应用到日常生活的很多方面了,USB是一种高速的串口通讯协议,USB接口非常复杂,通常被用在需要传输大量数据数据的地 方,如U盘.相机.打印机等.除了USB这种较 ...

  3. jQuery学习小结3——AJAX

    一.jQuery的Ajax方法 jQuery对Ajax 做了大量的封装,使用起来也较为方便,不需要去考虑浏览器兼容性.对于封装的方式,jQuery 采用了三层封装: 最底层的封装方法为——$.ajax ...

  4. Mysql 字符串处理函数

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

  5. Android TextView标签的显示

    在默认情况下,如果一个TextView中的文字太多,会跨行显示, 通过下面两个参数的设置,可以使TextView固定显示一行,未显示完成的后面用...... android:maxLines=&quo ...

  6. php 应用 cpu 100% 调试方法

    找出进程占用cpu高的原因. 进程占用cpu高,一般是由于进程长时间占用cpu,又没有主动释放占用.如果想主动释放cpu,可以调用sleep.在写程序的时候,尤其要注意while 等循环的地方. 找出 ...

  7. HTML 中 META的作用

    说明: meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:n ...

  8. NSArray和NSDictionary的混合

  9. S1 :闭包

    闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见方式,就是在一个函数内部创建另一个函数,以createComparisonFunction()函数为例 function createCo ...

  10. sql 给数据库表 字段 添加注释

    最近发现一些代码生成器 有针对注释做一个很好的转化,之前建表的时候 没有这块的注释.现在想增加,专门去看了下 如何增加注释 1 -- 表加注释 2 EXEC sys.sp_addextendedpro ...