# StructConver **Repository Path**: Ma3Ge/StructConver ## Basic Information - **Project Name**: StructConver - **Description**: C++的结构体定义转C#代码 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-08-13 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # StructConver #### 介绍 C++的结构体定义转C#代码 #### 软件说明 举例 将GlobalField.h文件放到StructConver工程目录下 然后开始处理.h文件 class Program { static void Main(string[] args) { //统计.h文件中声明的常量; ConverC.CountConstValue("GlobalField"); //把.h文件转化为同名cs文件 ConverC.ConverCStruct("GlobalField"); } } //如下我们得到C#的结构体定义; [StructLayout(LayoutKind.Sequential, Pack = 8)] public struct IPC_Head { public tagDataDescribe desc; public UInt16 wVersion; //IPC 版本 public UInt16 wRoomID; //房间ID public UInt16 wDataSize; //数据大小 public UInt32 wMainCmdID; //主命令码 public Int64 wSubCmdID; //子命令码 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] szTypeName; //种类名字 }; 把bing/Debug/下生成的 GlobalField.cs文件添加到工程引用中 Main函数加入该类的读写代码 class Program { static void Main(string[] args) { //ConverC.CountConstValue("GlobalField"); //ConverC.ConverCStruct("GlobalField"); //生成结构体转bytess数组的函数; WriteMsg.CreateClassStructToBytes(typeof(GlobalField)); //生成bytes数组转结构体函数; ReadMsg.CreateClassBytesToStruct(typeof(GlobalField)); } } ######## 最终我们得到GlobalField_Read.cs public static IPC_Head Read_IPC_Head(byte[] bytes) { // Marshal.SizeOf(IPC_Head)=56,Pack=8 IPC_Head obj = new IPC_Head(); int SizeConst = 0; int index = 0; byte[] bytes_desc = new byte[4]; Array.Copy(bytes, 0, bytes_desc , 0, 4); obj.desc= Read_tagDataDescribe(bytes_desc); obj.wVersion=BitConverter.ToUInt16(bytes , 4); obj.wRoomID=BitConverter.ToUInt16(bytes , 6); obj.wDataSize=BitConverter.ToUInt16(bytes , 8); obj.wMainCmdID=BitConverter.ToUInt32(bytes , 12); obj.wSubCmdID=BitConverter.ToInt64(bytes , 16); SizeConst = 32; index = 24; obj.szTypeName= Read_ByteArray(bytes, 24, SizeConst); return obj; } 和GlobalField_Write.cs public static byte[] Bytes_IPC_Head(IPC_Head obj) { // Marshal.SizeOf(IPC_Head)=56,Pack=8 byte[] bytes = new byte[56]; int sizeConst = 0; int index = 0; byte[] bytes_desc = Bytes_tagDataDescribe(obj.desc); Array.Copy(bytes_desc,0, bytes, 0, 4); Array.Copy( BitConverter.GetBytes(obj.wVersion) , 0, bytes, 4, 2); Array.Copy( BitConverter.GetBytes(obj.wRoomID) , 0, bytes, 6, 2); Array.Copy( BitConverter.GetBytes(obj.wDataSize) , 0, bytes, 8, 2); Array.Copy( BitConverter.GetBytes(obj.wMainCmdID) , 0, bytes, 12, 4); Array.Copy( BitConverter.GetBytes(obj.wSubCmdID) , 0, bytes, 16, 8); sizeConst = 32; index = 24; byte[] bts_szTypeName = Bytes_ByteArray(obj.szTypeName,32); Array.Copy( bts_szTypeName , 0, bytes, 24, 32); return bytes; } 生成结果可能提示小错误,再校对下即可