Golang Deco Enco
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的更多相关文章
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- 说说Golang的使用心得
13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直 ...
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩
目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...
- golang struct扩展函数参数命名警告
今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...
- golang语言构造函数
1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- golang的安装
整理了一下,网上关于golang的安装有三种方式(注明一下,我的环境为CentOS-6.x, 64bit) 方式一:yum安装(最简单) rpm -Uvh http://dl.fedoraprojec ...
- golang枚举类型 - iota用法拾遗
在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...
随机推荐
- 20145236 《Java程序设计》 第6周学习总结
20145236 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 InputStream与OutputStream 串流设计的概念 Java将输入/输出抽象化为串 ...
- Sumblime Text2安装Package Control两种方法+安装插件+注册码
刚开始不认识sumblime的时候,就直接在网上下载了一个最新版的sumblime text3,只是在配合使用go语言时,出现了一些不为自己知道的奇葩问题,于是果断把3卸载了,改成了sumblime ...
- 推荐cms
推荐cms : 国外:drupal joomla wordpress 国内:phpcms
- 25个有用和方便的 WordPress 速查手册
如果你是一个 WordPress 编码器或开发人员,下载一些方便的 WordPress 备忘单寻找你的工作然后你在正确的地方.我们已经列出了25个有用的和方便的 WordPress 速查手册.Word ...
- Python 条件判断 循环
age = 20 if age >= 18: print('your age is', age) print('adult') 根据Python的缩进规则,如果if语句判断是True,就把缩进的 ...
- Android打开新的Activity并同时关闭当前Activity
Intent it = new Intent(); it.setClass(EditActivity.this, MainActivity.class); it.setFlags(Intent.FLA ...
- ToolBar+DrawerLayout + NavigationView
http://www.jianshu.com/p/9471b87f2c61 很好的博客可以瞅瞅 <android.support.design.widget.NavigationView and ...
- [转][C/C++]函数名字修饰(Decorated Name)方式
1.C/C++函数修饰名: 对于我们的C/C++源程序而言,函数名只是函数的一小部分,函数还有调用方式(参数入栈方式).返回值类型.参数个数和各参数类型等信息,对于C++类成员函数,还有更多信息.这些 ...
- ASP.NET MVC4 & Entity Framework 6.0 IIS 部署出错解决方案
博客地址 http://blog.csdn.net/foxdave 近期了解MVC4的时候弄了一个简单的小工程,使用Entity Framework作为Model,F5启动调试运行的时候没有问题,但是 ...
- Android文件Apk下载变ZIP压缩包
在azure云存储中 上传apk文件 使用ie下载 变成zip压缩包 解决方法 编辑 blob 属性和元数据 修改 内容类型 为 application/vnd.android.package-arc ...