网络消息代码生成gencode
2014-04-26 21:08
183 查看
通过xml定义生成代码,支持数组变长数组结构体嵌套等,能满足常用需求 ,项目地址https://bitbucket.org/esrrhs/gencode
生成的例子
xml定义:
生成的例子
#pragma once #include <stdint.h> #define PROTO_MIN(a,b) ((a) < (b) ? (a) : (b)) namespace Protocol { // 消息id enum MsgID { // 请求登录 CS_REQ_LOGIN = 1, // 返回登录 SC_RES_LOGIN = 2, }; // 常量 enum ConstDefine { // 用户名 ACC_LEN = 32, // 角色名 NAME_LEN = 32, // 密码 PWD_LEN = 32, // 密码 ROLE_INFO_NUM = 5, // 好友 FRIEND_LEN = 50, }; // 账号信息 struct AccInfo { // 用户名 char m_Acc[ACC_LEN]; // 钻石 uint32_t m_diamond; int Marshal(char * destbuffer, int size) { int ret = 0; // 用户名 if (ret + (int)sizeof(m_Acc) > size) { return -ret; } strncpy(destbuffer, m_Acc, sizeof(m_Acc)); ret += sizeof(m_Acc); destbuffer += sizeof(m_Acc); // 钻石 if (ret + (int)sizeof(m_diamond) > size) { return -ret; } *(uint32_t*)destbuffer = m_diamond; ret += sizeof(m_diamond); destbuffer += sizeof(m_diamond); return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // 用户名 if (ret + (int)sizeof(m_Acc) > size) { return -ret; } strncpy(m_Acc, srcbuffer, sizeof(m_Acc)); ret += sizeof(m_Acc); srcbuffer += sizeof(m_Acc); // 钻石 if (ret + (int)sizeof(m_diamond) > size) { return -ret; } m_diamond = *(uint32_t*)srcbuffer; ret += sizeof(m_diamond); srcbuffer += sizeof(m_diamond); return ret; } }; // 好友信息 struct FriendInfo { // 数目 uint8_t m_Num; // 唯一id uint64_t m_Guid[FRIEND_LEN]; int Marshal(char * destbuffer, int size) { int ret = 0; // 数目 if (ret + (int)sizeof(m_Num) > size) { return -ret; } *(uint8_t*)destbuffer = m_Num; ret += sizeof(m_Num); destbuffer += sizeof(m_Num); // 唯一id int copyGuidSize = sizeof(uint64_t) * PROTO_MIN(FRIEND_LEN, m_Num); if (ret + copyGuidSize > size) { return -ret; } if (copyGuidSize > 0) { memcpy(destbuffer, m_Guid, copyGuidSize); } ret += copyGuidSize; destbuffer += copyGuidSize; return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // 数目 if (ret + (int)sizeof(m_Num) > size) { return -ret; } m_Num = *(uint8_t*)srcbuffer; ret += sizeof(m_Num); srcbuffer += sizeof(m_Num); // 唯一id int copyGuidSize = sizeof(uint64_t) * PROTO_MIN(FRIEND_LEN, m_Num); if (ret + copyGuidSize > size) { return -ret; } if (copyGuidSize > 0) { memcpy(m_Guid, srcbuffer, copyGuidSize); } ret += copyGuidSize; srcbuffer += copyGuidSize; m_Num = PROTO_MIN(m_Num, FRIEND_LEN); return ret; } }; // 玩家信息 struct RoleInfo { // 唯一id uint64_t m_Guid; // 角色名 char m_Name[NAME_LEN]; // 血量 uint32_t m_Hp; // 魔量 uint32_t m_Mp; // x float m_X; // y float m_Y; // 好友信息 FriendInfo m_FriendInfo; int Marshal(char * destbuffer, int size) { int ret = 0; // 唯一id if (ret + (int)sizeof(m_Guid) > size) { return -ret; } *(uint64_t*)destbuffer = m_Guid; ret += sizeof(m_Guid); destbuffer += sizeof(m_Guid); // 角色名 if (ret + (int)sizeof(m_Name) > size) { return -ret; } strncpy(destbuffer, m_Name, sizeof(m_Name)); ret += sizeof(m_Name); destbuffer += sizeof(m_Name); // 血量 if (ret + (int)sizeof(m_Hp) > size) { return -ret; } *(uint32_t*)destbuffer = m_Hp; ret += sizeof(m_Hp); destbuffer += sizeof(m_Hp); // 魔量 if (ret + (int)sizeof(m_Mp) > size) { return -ret; } *(uint32_t*)destbuffer = m_Mp; ret += sizeof(m_Mp); destbuffer += sizeof(m_Mp); // x if (ret + (int)sizeof(m_X) > size) { return -ret; } *(float*)destbuffer = m_X; ret += sizeof(m_X); destbuffer += sizeof(m_X); // y if (ret + (int)sizeof(m_Y) > size) { return -ret; } *(float*)destbuffer = m_Y; ret += sizeof(m_Y); destbuffer += sizeof(m_Y); // 好友信息 int retFriendInfo = m_FriendInfo.Marshal(destbuffer, size - ret); if (retFriendInfo <= 0) { return -ret + retFriendInfo; } ret += retFriendInfo; destbuffer += retFriendInfo; return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // 唯一id if (ret + (int)sizeof(m_Guid) > size) { return -ret; } m_Guid = *(uint64_t*)srcbuffer; ret += sizeof(m_Guid); srcbuffer += sizeof(m_Guid); // 角色名 if (ret + (int)sizeof(m_Name) > size) { return -ret; } strncpy(m_Name, srcbuffer, sizeof(m_Name)); ret += sizeof(m_Name); srcbuffer += sizeof(m_Name); // 血量 if (ret + (int)sizeof(m_Hp) > size) { return -ret; } m_Hp = *(uint32_t*)srcbuffer; ret += sizeof(m_Hp); srcbuffer += sizeof(m_Hp); // 魔量 if (ret + (int)sizeof(m_Mp) > size) { return -ret; } m_Mp = *(uint32_t*)srcbuffer; ret += sizeof(m_Mp); srcbuffer += sizeof(m_Mp); // x if (ret + (int)sizeof(m_X) > size) { return -ret; } m_X = *(float*)srcbuffer; ret += sizeof(m_X); srcbuffer += sizeof(m_X); // y if (ret + (int)sizeof(m_Y) > size) { return -ret; } m_Y = *(float*)srcbuffer; ret += sizeof(m_Y); srcbuffer += sizeof(m_Y); // 好友信息 int retFriendInfo = m_FriendInfo.Unmarshal(srcbuffer, size - ret); if (retFriendInfo <= 0) { return -ret + retFriendInfo; } ret += retFriendInfo; srcbuffer += retFriendInfo; return ret; } }; // 请求登录 struct CSReqLogin { // 用户名 char m_Acc[ACC_LEN]; // 密码 char m_Pwd[PWD_LEN]; int Marshal(char * destbuffer, int size) { int ret = 0; // 用户名 if (ret + (int)sizeof(m_Acc) > size) { return -ret; } strncpy(destbuffer, m_Acc, sizeof(m_Acc)); ret += sizeof(m_Acc); destbuffer += sizeof(m_Acc); // 密码 if (ret + (int)sizeof(m_Pwd) > size) { return -ret; } strncpy(destbuffer, m_Pwd, sizeof(m_Pwd)); ret += sizeof(m_Pwd); destbuffer += sizeof(m_Pwd); return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // 用户名 if (ret + (int)sizeof(m_Acc) > size) { return -ret; } strncpy(m_Acc, srcbuffer, sizeof(m_Acc)); ret += sizeof(m_Acc); srcbuffer += sizeof(m_Acc); // 密码 if (ret + (int)sizeof(m_Pwd) > size) { return -ret; } strncpy(m_Pwd, srcbuffer, sizeof(m_Pwd)); ret += sizeof(m_Pwd); srcbuffer += sizeof(m_Pwd); return ret; } }; // 返回登录 struct SCResLogin { // 结果 uint8_t m_Ret; // 账号信息 AccInfo m_AccInfo; // 玩家数目 uint8_t m_RoleInfoNum; // 玩家信息 RoleInfo m_RoleInfo[ROLE_INFO_NUM]; int Marshal(char * destbuffer, int size) { int ret = 0; // 结果 if (ret + (int)sizeof(m_Ret) > size) { return -ret; } *(uint8_t*)destbuffer = m_Ret; ret += sizeof(m_Ret); destbuffer += sizeof(m_Ret); // 账号信息 int retAccInfo = m_AccInfo.Marshal(destbuffer, size - ret); if (retAccInfo <= 0) { return -ret + retAccInfo; } ret += retAccInfo; destbuffer += retAccInfo; // 玩家数目 if (ret + (int)sizeof(m_RoleInfoNum) > size) { return -ret; } *(uint8_t*)destbuffer = m_RoleInfoNum; ret += sizeof(m_RoleInfoNum); destbuffer += sizeof(m_RoleInfoNum); // 玩家信息 for (int i = 0; i < ROLE_INFO_NUM && i < m_RoleInfoNum; i++) { int retRoleInfo = m_RoleInfo[i].Marshal(destbuffer, size - ret); if (retRoleInfo <= 0) { return -ret + retRoleInfo; } ret += retRoleInfo; destbuffer += retRoleInfo; } return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // 结果 if (ret + (int)sizeof(m_Ret) > size) { return -ret; } m_Ret = *(uint8_t*)srcbuffer; ret += sizeof(m_Ret); srcbuffer += sizeof(m_Ret); // 账号信息 int retAccInfo = m_AccInfo.Unmarshal(srcbuffer, size - ret); if (retAccInfo <= 0) { return -ret + retAccInfo; } ret += retAccInfo; srcbuffer += retAccInfo; // 玩家数目 if (ret + (int)sizeof(m_RoleInfoNum) > size) { return -ret; } m_RoleInfoNum = *(uint8_t*)srcbuffer; ret += sizeof(m_RoleInfoNum); srcbuffer += sizeof(m_RoleInfoNum); // 玩家信息 for (int i = 0; i < ROLE_INFO_NUM && i < m_RoleInfoNum; i++) { int retRoleInfo = m_RoleInfo[i].Unmarshal(srcbuffer, size - ret); if (retRoleInfo <= 0) { return -ret + retRoleInfo; } ret += retRoleInfo; srcbuffer += retRoleInfo; } m_RoleInfoNum = PROTO_MIN(m_RoleInfoNum, ROLE_INFO_NUM); return ret; } }; // 网络头消息 struct NetMsgHead { // 时间戳 uint32_t m_Time; // 序列号 uint32_t m_Index; int Marshal(char * destbuffer, int size) { int ret = 0; // 时间戳 if (ret + (int)sizeof(m_Time) > size) { return -ret; } *(uint32_t*)destbuffer = m_Time; ret += sizeof(m_Time); destbuffer += sizeof(m_Time); // 序列号 if (ret + (int)sizeof(m_Index) > size) { return -ret; } *(uint32_t*)destbuffer = m_Index; ret += sizeof(m_Index); destbuffer += sizeof(m_Index); return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // 时间戳 if (ret + (int)sizeof(m_Time) > size) { return -ret; } m_Time = *(uint32_t*)srcbuffer; ret += sizeof(m_Time); srcbuffer += sizeof(m_Time); // 序列号 if (ret + (int)sizeof(m_Index) > size) { return -ret; } m_Index = *(uint32_t*)srcbuffer; ret += sizeof(m_Index); srcbuffer += sizeof(m_Index); return ret; } }; // 网络消息内容 struct NetMsgPara { // Type int32_t m_Type; union { // 请求登录 CSReqLogin m_CSReqLogin; // 返回登录 SCResLogin m_SCResLogin; }; int Marshal(char * destbuffer, int size) { int ret = 0; // type if (ret + (int)sizeof(m_Type) > size) { return -ret; } *(int32_t*)destbuffer = m_Type; ret += sizeof(m_Type); destbuffer += sizeof(m_Type); switch (m_Type) { // 请求登录 case CS_REQ_LOGIN: { int retCSReqLogin = m_CSReqLogin.Marshal(destbuffer, size - ret); if (retCSReqLogin <= 0) { return -ret + retCSReqLogin; } ret += retCSReqLogin; destbuffer += retCSReqLogin; } break; // 返回登录 case SC_RES_LOGIN: { int retSCResLogin = m_SCResLogin.Marshal(destbuffer, size - ret); if (retSCResLogin <= 0) { return -ret + retSCResLogin; } ret += retSCResLogin; destbuffer += retSCResLogin; } break; default: return -ret; } return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // type if (ret + (int)sizeof(m_Type) > size) { return -ret; } m_Type = *(int32_t*)srcbuffer; ret += sizeof(m_Type); srcbuffer += sizeof(m_Type); switch (m_Type) { // 请求登录 case CS_REQ_LOGIN: { int retCSReqLogin = m_CSReqLogin.Unmarshal(srcbuffer, size - ret); if (retCSReqLogin <= 0) { return -ret + retCSReqLogin; } ret += retCSReqLogin; srcbuffer += retCSReqLogin; } break; // 返回登录 case SC_RES_LOGIN: { int retSCResLogin = m_SCResLogin.Unmarshal(srcbuffer, size - ret); if (retSCResLogin <= 0) { return -ret + retSCResLogin; } ret += retSCResLogin; srcbuffer += retSCResLogin; } break; default: return -ret; } return ret; } }; // 网络消息 struct NetMsg { // 网络头消息 NetMsgHead m_NetMsgHead; // 网络消息内容 NetMsgPara m_NetMsgPara; int Marshal(char * destbuffer, int size) { int ret = 0; // 网络头消息 int retNetMsgHead = m_NetMsgHead.Marshal(destbuffer, size - ret); if (retNetMsgHead <= 0) { return -ret + retNetMsgHead; } ret += retNetMsgHead; destbuffer += retNetMsgHead; // 网络消息内容 int retNetMsgPara = m_NetMsgPara.Marshal(destbuffer, size - ret); if (retNetMsgPara <= 0) { return -ret + retNetMsgPara; } ret += retNetMsgPara; destbuffer += retNetMsgPara; return ret; } int Unmarshal(char * srcbuffer, int size) { int ret = 0; // 网络头消息 int retNetMsgHead = m_NetMsgHead.Unmarshal(srcbuffer, size - ret); if (retNetMsgHead <= 0) { return -ret + retNetMsgHead; } ret += retNetMsgHead; srcbuffer += retNetMsgHead; // 网络消息内容 int retNetMsgPara = m_NetMsgPara.Unmarshal(srcbuffer, size - ret); if (retNetMsgPara <= 0) { return -ret + retNetMsgPara; } ret += retNetMsgPara; srcbuffer += retNetMsgPara; return ret; } }; }
xml定义:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <result> <enum name="MsgID" comment="消息id"> <member name="CS_REQ_LOGIN" type="1" comment="请求登录"/> <member name="SC_RES_LOGIN" type="2" comment="返回登录"/> </enum> <enum name="ConstDefine" comment="常量"> <member name="ACC_LEN" type="32" comment="用户名"/> <member name="NAME_LEN" type="32" comment="角色名"/> <member name="PWD_LEN" type="32" comment="密码"/> <member name="ROLE_INFO_NUM" type="5" comment="密码"/> <member name="FRIEND_LEN" type="50" comment="好友"/> </enum> <struct name="AccInfo" comment="账号信息"> <member name="Acc" type="char" length="ACC_LEN" comment="用户名"/> <member name="diamond" type="uint32_t" comment="钻石"/> </struct> <struct name="FriendInfo" comment="好友信息"> <member name="Num" type="uint8_t" comment="数目"/> <member name="Guid" type="uint64_t" length="FRIEND_LEN" ref="Num" comment="唯一id"/> </struct> <struct name="RoleInfo" comment="玩家信息"> <member name="Guid" type="uint64_t" comment="唯一id"/> <member name="Name" type="char" length="NAME_LEN" comment="角色名"/> <member name="Hp" type="uint32_t" comment="血量"/> <member name="Mp" type="uint32_t" comment="魔量"/> <member name="X" type="float" comment="x"/> <member name="Y" type="float" comment="y"/> <member name="FriendInfo" type="FriendInfo" comment="好友信息"/> </struct> <struct name="CSReqLogin" comment="请求登录"> <member name="Acc" type="char" length="ACC_LEN" comment="用户名"/> <member name="Pwd" type="char" length="PWD_LEN" comment="密码"/> </struct> <struct name="SCResLogin" comment="返回登录"> <member name="Ret" type="uint8_t" comment="结果"/> <member name="AccInfo" type="AccInfo" comment="账号信息"/> <member name="RoleInfoNum" type="uint8_t" comment="玩家数目"/> <member name="RoleInfo" type="RoleInfo" length="ROLE_INFO_NUM" ref="RoleInfoNum" comment="玩家信息"/> </struct> <struct name="NetMsgHead" comment="网络头消息"> <member name="Time" type="uint32_t" comment="时间戳"/> <member name="Index" type="uint32_t" comment="序列号"/> </struct> <struct name="NetMsgPara" comment="网络消息内容" type="union"> <member name="CSReqLogin" type="CSReqLogin" ref="CS_REQ_LOGIN" comment="请求登录"/> <member name="SCResLogin" type="SCResLogin" ref="SC_RES_LOGIN" comment="返回登录"/> </struct> <struct name="NetMsg" comment="网络消息"> <member name="NetMsgHead" type="NetMsgHead" comment="网络头消息"/> <member name="NetMsgPara" type="NetMsgPara" comment="网络消息内容"/> </struct> </result>
相关文章推荐
- 学习笔记:生成对抗网络(Generative Adversarial Nets)(附代码)
- 生成对抗网络DCGAN+Tensorflow代码学习笔记(二)----utils.py
- 第三篇:JAVA网络编程之应用程序协议中消息的成帧与解析(含代码)
- Seq2Seq非常好的代码(机器翻译、对话生成等):漫谈四种神经网络序列解码模型【附示例代码】
- 第四篇:JAVA网络编程之构建和解析自定义协议消息(含代码)
- [Android实例] Android Studio插件-自动根据布局生成Activity等代码1.4 (开源)(申明:来源于网络)
- 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)【转】
- 【明星自动大变脸】最新StarGAN对抗生成网络实现多领域图像变换(附代码)
- 若要调试此模块,请将其项目生成配置更改为“调试”模式。若要取消显示此消息,请禁用“启动时若没有用户代码则发出警告”调试器选项。
- 网络协议解析数据设计和excel辅助生成代码
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析) Webservice的wsdl文件解析与Soap消息的发送、接收(不生成java客户端代码)
- [网络收集]Asp.net上传图片同时生成缩略图和水印图后台代码
- 制作新网络框架快速自动生成消息结构体的编辑器
- 50行代码实现对抗生成网络GAN
- 用于代码生成的抽象语法网络 (侵图删)
- 对生成对抗网络GANs原理、实现过程、应用场景的理解(附代码),另附:深度学习大神文章列表
- 网络消息结构体脚本自动生成编辑器的进一步扩展
- 生成对抗网络DCGAN+Tensorflow代码学习笔记(三)----ops.py
- 若要调试此模块,请将其项目生成配置更改为“调试”模式。若要取消显示此消息,请禁用“启动时若没有用户代码则发出警告”调试器选项
- NW网络生成MATLAB代码