【发布时间】:2020-12-08 01:29:27
【问题描述】:
我正在调试由第 3 方编写的 C# 代码。该项目是一个旧的 C++ 项目,由承包商用 C# 重写,我无权访问承包商。我编写了原始的 C++ 版本。
问题在于,当 C# 代码获取表示通过 UDP 连接接收的数据的结构的大小时。
结构体定义为:
[StructLayout(LayoutKind.Sequential,Pack=1)]
internal class PROXY_HDR {
public ushort pad;
public ushort label;
public char flags;
public ushort length;
public char[] ip = new char[4];
public ushort port;
}
这个结构的大小被检索为:
int size = Marshal.Sizeof(typeof(PROXY_HDR));
并且返回的值是 17 而不是预期的 13。有 4 个字节的差异,我怀疑 ip 成员,但这只是因为它的表达方式与其他成员不同(使用 'new' ),但我没有其他决定依据。
我通常不会在我的 C# 代码中使用这种类型的封送处理来毫无问题地解析接收到的数据包,所以我不知道如何修改这个结构定义以使其与原始版本大小“对齐”-明智的。
我可以用
替换元帅线int size = 13;
但那是作弊,对吧?
我可以通过某种方式修改此布局以使尺寸正确吗?
【问题讨论】:
-
我没有实际答案,但您可以尝试像我在 this answer 中针对不相关问题所做的那样明确设置字段偏移量。
-
你为什么希望它是 13?
-
@IanKemp 因为对于 x86(32 位)它确实返回 13,如果编译 x64 则返回 +4...
-
@AlexeiLevenkov -- 如果你正确编组它,它会在 64 位 和 32 位 下返回 13 个字节
-
@Andy 确实 - 也没有问题要问:) 显然,每天不做这些事情的人都不会期望
char有 sizeof = 1 ... 而 OP 不知道引用类型...有很多东西要解释。
标签: c# c++ marshalling structlayout