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 ...
随机推荐
- MVC中view页面用jquery方法绑定select控件值
var sortid = '@Model.myWorkMatter.WorkMatterSortID'; $("#selectSort").val(sortid); $(" ...
- js首字母大写--单个单词的处理方式
var operate2='OR'; for (var j = 0, len = operate1.length; j< len; j++) { //获得unicode码 var ch2 = o ...
- 转:PHP Composer 管理工具的介绍 这个相对清晰点
转自:http://www.aichengxu.com/view/14872 一.PHP的一些臭历史 Dependency Manager For PHP,Composer.在Composer还没诞生 ...
- java 面向对象编程-- 第15章 集合框架
1. 集合特点:元素类型不同.集合长度可变.空间不固定 2. java中对一些数据结构和算法进行了封装即集合.集合也是一种对象,用于存储.检索.操作和传输对象. 3. JCF(Java Coll ...
- 异步加载js
//异步加载js function loadScript(url,callback){ var script = document.createElement("script"); ...
- 浏览器渲染原理--reflow
Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都是 ...
- php base64_decode 解码方法
<?php header('Content-Type:text/html;charset=utf-8'); function encode_file_contents($filename) { ...
- Rhel6-haproxy+keepalived配置文档
系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.119:haproxy,keepalived server19.exa ...
- 使用Myeclipse创建自定义签名debug keystore
1.在已经创建后的android项目上右击鼠标,如图所示 2.选择next下一步 3.选择create new keystore 注意 这里密码要输入android 4.点击next,录入基本信息 ...
- [microsoft]PE和COFF文件格式
前言 我们知道,vs的C/C++编译工具把每一个编译单元(一个.c或.cpp源文件)编译成一个对象文件(.obj文件):然后用链接器把这些对象文件组合一个单个文件(.exe文件),称为可移植的可执行文 ...