C# C语言中字节数组数据到结构的映射#
我已经为一个问题绞尽脑汁好几个小时了,所以我转过来看看是否有人知道如何解决这个问题。 我有一个传统的C++程序,它通过套接字发送数据包。这些包含C++结构,我认为在C语言应用程序中只定义一个结构类似C++中的结构,只需读取字节数组即可。 我注意到这并不是那么简单,我想我已经把问题归结为对齐问题,但我真的无法解决它 <>我的C++结构看起来像这样:C# C语言中字节数组数据到结构的映射#,c#,c++,bytearray,struct,C#,C++,Bytearray,Struct,我已经为一个问题绞尽脑汁好几个小时了,所以我转过来看看是否有人知道如何解决这个问题。 我有一个传统的C++程序,它通过套接字发送数据包。这些包含C++结构,我认为在C语言应用程序中只定义一个结构类似C++中的结构,只需读取字节数组即可。 我注意到这并不是那么简单,我想我已经把问题归结为对齐问题,但我真的无法解决它 我的C++结构看起来像这样: typedef struct { int int_1; short short
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;
[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结构:
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;
[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#中的结构更容易使用,我不会对它感到困惑
当使用一些测试数据时,其结果似乎是int_1、long_1和short_1得到了正确的值,而其他的一切都是垃圾,这就是为什么我怀疑这里的问题是短路
任何想法都是非常受欢迎的
/J
编辑:至于为什么我用12而不是10来表示字符串偏移量,是因为字符必须从一个偶数双字开始,如果我用10来代替我认为应该是的(我知道我的数学,谢谢),我会崩溃无法从程序集“SocketAndStructTest,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”加载类型“TEST\u KLIENT\u REC”,因为它包含偏移量为10的对象字段,该字段未正确对齐或与非对象字段重叠。“您的
字段偏移量
没有按照您预期的方式排列。例如,在两个I_4和一个I_2之后,您有FieldOffset(12)
,而我认为您需要FieldOffset(10)
另外,我认为您需要将
[StructLayout(LayoutKind.Explicit)]
应用于struct
6+4!=12,只是说:“至于检查,在C/C++和C++中做‘sieof’,并比较它们。我添加了一个编辑,说明为什么我不能使用更逻辑数的10。为什么你不使用C++结构中的长类型来匹配C++中的长类型?因为C++中长的是四字节长,这就转化为C中的INT32(int)。很抱歉,我有明确的部分,只是忘了把它复制到问题文本中。关于12对10,我对我的帖子做了一个简短的编辑。所以不要去那里。