我一直在努力解决问题太多时间所以我转过来看看是否有人知道如何解决这个问题。 我有一个遗留的C ++程序,通过套接字发送数据包。这些包含C ++结构,我认为在我的C#应用程序中定义一个类似于C ++的结构并且只读取字节数组会很容易。 我注意到它并不那么简单,我想我已经把问题归结为对齐,但我真的无法理解它。
我的C ++结构如下所示:
typedef struct
{
int int_1;
short short_1;
long long_1;
char char_11[11];
long long_2;
short short_2;
int int_2;
} TEST_KLIENT_REC, *PTEST_KLIENT_REC;
我认为我可以将其翻译成这样的C#结构:
[StructLayout(LayoutKind.Explicit, Pack=0)]
public struct TEST_KLIENT_REC
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.I4)]
public int int_1; // 4
[FieldOffset(4)]
[MarshalAs(UnmanagedType.I2)]
public short short_1; // 2
[FieldOffset(6)]
[MarshalAs(UnmanagedType.I4)]
public int long_1; // 4
[FieldOffset(12)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=11)]
public string char_11; // 11
[FieldOffset(22)]
[MarshalAs(UnmanagedType.I4)]
public int long_2; // 4
[FieldOffset(26)]
[MarshalAs(UnmanagedType.I2)]
public short short_2; // 2
[FieldOffset(28)]
[MarshalAs(UnmanagedType.I4)]
public int int_2; // 4
}
问题似乎是C#如何映射为short(放入2个字节的填充?),这导致结构的其余部分严重对齐并创建垃圾数据。 是否有可能以某种方式使这项工作? 如果类更容易使用C#,我不会在C#中使用结构模糊。
用一些测试数据时,这个结果似乎是INT_1,long_1和short_1得到正确的价值观和其他一切是垃圾,这就是为什么我怀疑短期是这里的问题。
任何想法都受到欢迎。
/ J
编辑:至于为什么我有12个而不是10期等距的字符串是因为它似乎焦炭ararys必须在一个甚至DWORD开始,如果我把10,而不是因为我认为它应该是(我知道我的数学谢谢你)我与“崩溃未能从程序集加载类型“TEST_KLIENT_REC‘SocketAndStructTest,版本= 1.0.0.0,文化=中立,公钥=空’,因为它包含的对象场的偏移10是正确对齐或重叠一个非对象字段。“
答案 0 :(得分:2)
你的FieldOffsets
没有按照你期望的方式排队。例如,在两个I_4和I_2之后,您有FieldOffset(12)
,而我认为您需要FieldOffset(10)
。
此外,我认为您需要将[StructLayout(LayoutKind.Explicit)]
应用于struct
。