【发布时间】:2010-10-16 00:42:17
【问题描述】:
我有一个 TCP 客户端,它将一个数据包放入一个结构中
using System.Runtime.InteropServices;
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct tPacket_5000_E
{
public Int16 size;
public Int16 opcode;
public byte securityCount;
public byte securityCRC;
public byte flag;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I1)]
public byte[] blowfish;
public UInt32 seedCount;
public UInt32 seedCRC;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 5, ArraySubType = UnmanagedType.I1)]
public UInt32[] seedsecurity;
}
我用来将数据包放入结构中的代码是:
tPacket_5000_E packet = new tPacket_5000_E();
GCHandle pin = GCHandle.Alloc(data, GCHandleType.Pinned);
packet = (tPacket_5000_E)Marshal.PtrToStructure(pin.AddrOfPinnedObject(), typeof(tPacket_5000_E));
pin.Free();
现在,在我继续之前,我必须告诉你,我正在将这个项目从 C++ 翻译成 C#。
这就是问题所在:
tPacket_5000_E 的最后 3 个成员是 Int32(我也试过 UInt32),在 C++ 中是 DWORD。 这三个成员之前的值,即NOT Int32,与C++中的值相同。(我在C++和C#项目中都注入了相同的数据包)。
但是,这三个成员的值不同。
在 C++ 中,这些值是(正确):
- seedCount:0x00000079
- seedCRC:0x000000d1
- SeedSecurity:
- -[0]:0x548ac099
- -1:0x03c4d378
- -[2]:0x292e9eab
- -[3]:0x4eee5ee3
- -[4]:0x1071206e
在 C# 中,这些值是(不正确):
- seedCount:0xd1000000
- seedCRC:0x99000000
- SeedSecurity:
- -[0]: 0x78548ac0
- -1:0xab03c4d3
- -[2]: 0xe3292e9e
- -[3]: 0x6e4eee5e
- -[4]: 0x00107120
两个应用程序中的数据包是相等的
byte[] data = new byte[] {
0x25, 0x00, 0x00, 0x50, 0x00, 0x00, 0x0E, 0x10,
0xCE, 0xEF, 0x47, 0xDA, 0xC3, 0xFE, 0xFF, 0x79,
0x00, 0x00, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x99,
0xC0, 0x8A, 0x54, 0x78, 0xD3, 0xC4, 0x03, 0xAB,
0x9E, 0x2E, 0x29, 0xE3, 0x5E, 0xEE, 0x4E, 0x6E,
0x20, 0x71, 0x10};
Click here for further information
为什么结构中的最后三个成员不同以及如何修复它们?
提前致谢!
【问题讨论】:
标签: c# struct memory-layout