C++结构体转换成C#

yrcy04183 2011-08-27 05:53:49
C++结构体
typedef struct tagDGRAMHEADER_STATUS
{
WORD wFlag;
BYTE ucFunction;
union
{
BYTE pParams[5];
struct
{
BYTE ucParam1;
BYTE ucParam2;
BYTE ucParam3;
BYTE ucParam4;
BYTE ucParam5;
} ucParam;
};
BYTE ucAttachData1[50];
BYTE ucAttachData2[50];
} DGRAMHEADER_STATUS, *LPDGRAMHEADER_STATUS;

如何转换成C#的结构体
...全文
434 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-08-31
  • 打赏
  • 举报
回复
根据Union的特殊性,直接打散,融合到一个结构体里面。。。。
sdl2005lyx 2011-08-31
  • 打赏
  • 举报
回复
完整解决:

StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct tagDGRAMHEADER_STATUS
{
public UInt16 wFlag;
public Byte ucFunction;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public Byte [] pParams;
public Byte ucParam1
{
get
{
return pParams[0];
}
set
{
Buffer.BlockCopy( BitConverter.GetBytes(value) ,0,pParams,0,1);
}
}
public Byte ucParam2
{
get
{
return pParams[1];
}
set
{
Buffer.BlockCopy( BitConverter.GetBytes(value) ,0,pParams,0,1,1);
}
}
public Byte ucParam3
{
get
{
return pParams[2];
}
set
{
Buffer.BlockCopy( BitConverter.GetBytes(value) ,0,pParams,0,2,1);
}
}
public Byte ucParam4
{
get
{
return pParams[3];
}
set
{
Buffer.BlockCopy( BitConverter.GetBytes(value) ,0,pParams,0,3,1);
}
}
public Byte ucParam5
{
get
{
return pParams[4];
}
set
{
Buffer.BlockCopy( BitConverter.GetBytes(value) ,0,pParams,0,4,1);
}
}

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public Byte [] ucAttachData1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public Byte [] ucAttachData2;
}
wziyx513225244 2011-08-31
  • 打赏
  • 举报
回复
关注一下,有用的东西
qldsrx 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jackyjkchen 的回复:]
http://topic.csdn.net/u/20110827/18/aeb93f04-ac1c-4258-92e0-56eab0b8448e.html
参见另一帖
[/Quote]
C++大牛,C#就别献丑了。
代码显然有问题,FieldOffset不加(乱加),MarshalAs也没有,能用才怪了。
最大的错误是,结构体里声明了另一个结构体,但未给它设置对象,也就是定义了类型未使用。

我写了一个类型,参考下,命名可以自己调整:

public struct ST_Params
{
public byte ucParam1;
public byte ucParam2;
public byte ucParam3;
public byte ucParam4;
public byte ucParam5;
};
/// <summary>
/// C++中union 的C#写法。
/// </summary>
public struct UCPARAM
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public byte[] pParams;

public ST_Params ucParam
{
get
{
return new ST_Params() { ucParam1 = pParams[0], ucParam2 = pParams[1], ucParam3 = pParams[2], ucParam4 = pParams[3], ucParam5 = pParams[4] };
}
set
{
pParams[0] = value.ucParam1;
pParams[1] = value.ucParam2;
pParams[2] = value.ucParam3;
pParams[3] = value.ucParam4;
pParams[4] = value.ucParam5;
}
}
};

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DGRAMHEADER_STATUS
{
public short wFlag;
public byte ucFunction;
public UCPARAM ucParam;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public byte[] ucAttachData1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public byte[] ucAttachData2;
}
gomoku 2011-08-28
  • 打赏
  • 举报
回复
改错(请把ByValTStr换成ByValArray):
[MarshalAs( UnmanagedType.ByValArray, SizeConst= 5)]
public byte[] pParams;
[MarshalAs( UnmanagedType.ByValArray, SizeConst= 50)]
public byte[] ucAttachData1;
[MarshalAs( UnmanagedType.ByValArray, SizeConst= 50)]
public byte[] ucAttachData2;
gomoku 2011-08-28
  • 打赏
  • 举报
回复
这里的union很容易处理。不过小心对齐要跟C++一样。

[StructLayout(LayoutKind.Sequential, Pack=...)]
struct DGRAMHEADER_STATUS
{
public short wFlag;
public byte ucFunction;
[MarshalAs( UnmanagedType.ByValTStr, SizeConst= 5)]
public byte[] pParams;
[MarshalAs( UnmanagedType.ByValTStr, SizeConst= 50)]
public byte[] ucAttachData1;
[MarshalAs( UnmanagedType.ByValTStr, SizeConst= 50)]
public byte[] ucAttachData2;

public byte ucParam1 { get { return pParams[0]; } }
public byte ucParam2 { get { return pParams[1]; } }
public byte ucParam3 { get { return pParams[2]; } }
public byte ucParam4 { get { return pParams[3]; } }
public byte ucParam5 { get { return pParams[4]; } }
}
jackyjkchen 2011-08-27
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110827/18/aeb93f04-ac1c-4258-92e0-56eab0b8448e.html
参见另一帖

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧