首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Marshal.SizeOf()在C#中正确计算结构大小?

如何使用Marshal.SizeOf()在C#中正确计算结构大小?
EN

Stack Overflow用户
提问于 2021-05-19 09:09:46
回答 1查看 242关注 0票数 0

我在用这个砸我的头。我有一个C#结构:

代码语言:javascript
运行
复制
    [StructLayout(LayoutKind.Sequential)]
    public struct Enroll
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 101)]
        public char[] Name;
        public UInt16 Port;
        public byte Num;
        public byte Max;
        public UInt64 Version;
        public byte TS;
        public byte Avg;
        public byte Flags;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public char[] Tag;
    }

总计为132个字节。然而,

代码语言:javascript
运行
复制
S.Enroll X = new();
int size = Marshal.SizeOf(X);

计算144个字节,从而阻止我成功地将字节映射到结构。

发送方是一个C++应用程序,其结构声明如下:

代码语言:javascript
运行
复制
struct Enroll
{
public:
    char Name[101] = { 0 };
    uint16 Port = 0;
    uint8 Num = 0;
    uint8 Max = 0;
    uint64 Version = 0;
    uint8 TS = 0;
    uint8 Avg = 0;
    DevFlags Flags = DevFlags ::None;
    char Tag[16] = { 0 };
};

这导致了实际的132个字节,我可以一个一个地读取。

我遗漏了什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-19 09:35:32

正如马修沃森所建议的,Pack=1解决了我的问题。Sinatr的链接解释道:

Pack字段控制内存中类型字段的对齐。它影响LayoutKind.Sequential。默认情况下,值为0,指示当前平台的默认打包大小。Pack的值必须为0、1、2、4、8、16、32、64或128: 类型实例的字段通过使用以下规则对齐: 类型的对齐是其最大元素(1、2、4、8等字节)的大小或指定的包装大小,以较小者为准。 每个字段必须与其自身大小的字段(1、2、4、8等字节)或类型的对齐对齐,以较小的字段为准。由于类型的默认对齐方式是其最大元素的大小,该元素大于或等于所有其他字段长度,这通常意味着字段按其大小对齐。例如,即使类型中最大的字段是64位(8字节)整数或Pack字段设置为8,字节字段在1字节边界上对齐,Int16字段在2字节边界上对齐,Int32字段在4字节边界上对齐。 在字段之间添加填充以满足对齐要求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67600207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档