如何正确计算头文件中结构体的大小

小新小小新 2017-09-13 09:25:18
在c#工程中,将某个.h头文件进行导入,解析其中的数据结构,并对其进行计算,并改写成描述性文件内容,如下:

struct A
{
int a;
char b;
unsinged short c[11];
...
}A;

这个是放在头文件中的,对于这个需求,即在c#中计算N个这类结构体的大小,应该如何实现?
另外,在改写成描述性内容的情况下,如

<node id="structA name" type="parent" size="xx">
<item id="a" size = "4" .../>
<item id="b" size = "1" .../>
<item id="c" size = "22" .../>
</node>

在上面的描述内容中,是已经将结构体的参数给描述出来了,但是,对于实际内存内容而言,在内存对齐的时候,是有遗漏
的,假设此处将node处的size以其所有子节点的size相加,得到size1=27,但是实际在内存中的大小则是size2=28,在描述
内容中缺少了对齐位的描述,造成在其他地方使用该buffer时,无法匹配的情况;

另外,这个无法在c#中定义结构体来实现这个需求,因为此处的结构体文件内的数据提定义本身是不确定的,还请各位大神
帮忙看下是否有解决方法,或者是思路,以及借鉴的开源工程
...全文
291 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodish 2017-09-13
  • 打赏
  • 举报
回复
头文件中的结构不确定可变,那么对应C#中的结构定义也不至于不能变? 那个XML描述文件应该不是必须的. 如果真想灵活点,C++的结构定义可以用union,然后C#的结构用FieldOffset明确偏移. 下面的例子是按你的例子写的,得出的Size=28.

[StructLayout(LayoutKind.Sequential,Pack =4)]
    public struct A
    {
        public int a;
        public char b;
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U2, SizeConst =11)]
        public ushort[] c;
    }

 A a = new A();
 a.c = new ushort[11];

 Debug.Assert(Marshal.SizeOf(a) == 28);

111,097

社区成员

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

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

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