我正在调试第三方编写的 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成员,但只是因为它的表达方式与其他成员不同(带有“新”),但我没有其他基础来决定。
我通常不会在 C# 代码中使用这种类型的封送处理来毫无问题地解析接收到的数据包,因此我不知道如何修改此结构定义以使其在大小方面与原始版本“对齐”。
我可以用以下内容替换元帅线
int size = 13;
但这是作弊,对吧?
我可以以某种方式修改此布局以使尺寸正确吗?
将其添加到结构中:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal class PROXY_HDR
{
public ushort pad;
public ushort label;
public byte flags;
public ushort length;
[MarshalAs(UnmanagedType.ByValArray,
SizeConst = 4, ArraySubType = UnmanagedType.U1)]
public byte[] ip;
public ushort port;
}
这将告诉编译器将其视为典型的 C 风格数组,而不是指针。这should是字节,因为 IP 地址是无符号字符数组。char
通常不会在这些类型的标头中使用,它通常byte
(i.e: unsigned char
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)