falsche Mitglieder, um in einem C# - Struktur
-
22-08-2019 - |
Frage
Ich habe einen TCP-Client,D. H. ein Paket in einer Struktur
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;
}
Der code, den ich benutze, um das Paket in der Struktur ist:
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();
Nun,bevor ich weiter muss ich dir sagen, dass ich die übersetzung dieses Projekt von C++ zu C#.
Das ist das problem:
Die letzten 3 Mitglieder tPacket_5000_E sind Int32(ich habe versucht, UInt32 auch),das DWORD in C++.Die Werte, bevor die drei Mitglieder,die NICHT Int32,sind gleich denen, die in C++.(Ich Spritzen gleiche Paket in der C++ - und C# - Projekt).
Jedoch,die drei Mitglieder haben unterschiedliche Werte.
in C++ werden die Werte(richtige):
- seedCount:0x00000079
- seedCRC:0x000000d1
- SeedSecurity:
- -[0]:0x548ac099
- -1:0x03c4d378
- -[2]:0x292e9eab
- -[3]:0x4eee5ee3
- -[4]:0x1071206e
in C# werden die Werte(falsch):
- seedCount:0xd1000000
- seedCRC:0x99000000
- SeedSecurity:
- -[0]:0x78548ac0
- -1:0xab03c4d3
- -[2]:0xe3292e9e
- -[3]:0x6e4eee5e
- -[4]:0x00107120
Das Paket in beiden Anwendungen gleich
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};
Klicken Sie hier für weitere Informationen
Warum die letzten drei Mitglieder in die Struktur unterscheiden und wie Sie zu beheben?
Vielen Dank im Voraus!
Lösung
Ich würde erwarten, dass die Wurzel Ihres Problems ist, dass die drei-byte-Werte
public byte securityCount;
public byte securityCRC;
public byte flag;
führen Sie die nächsten 32-bit-Werte nicht "word" ausgerichtet sein, und Ihre zwei Sätze von code hinzufügen (oder nicht hinzufügen) interne Polsterung anders.
Ich erwarte, dass die verschiedenen Packungen in etwa so Aussehen:
C++ C# ================================ ================================ [size ][opcode ] [size ][opcode ] [secCnt][secCrc][flag ][blow0 ] [secCnt][secCrc][flag ][blow0 ] [blow1 ][blow2 ][blow3 ][blow4 ] [blow1 ][blow2 ][blow3 ][blow4 ] [blow5 ][blow6 ][blow7 ][seedCou [blow5 ][blow6 ][blow7 ]..PAD... nt ][seedCRC [seedCount ] ][seedSec [seedCRC ] urity0 ][seedSec [seedSecurity0 ] urity1 ][seedSec [seedSecurity1 ] urity2 ][seedSec [seedSecurity2 ] urity3 ][seedSec [seedSecurity3 ] urity4 ] [seedSecurity4 ]
...mit C# einfügen von byte-padding wodurch später die Werte werden byteweise aus.
Können Sie versuchen, mit
[StructLayout(LayoutKind.Sequential,Pack=1)]
bevor Sie Ihre struct definition, was sollte die minimale Menge an Speicherplatz möglich.
Mastering Structs in C# hat einige gute Informationen darüber, wie/warum dies geschieht.
Andere Tipps
Ich vermute, dass Daniel L auf dem richtigen Weg in seine Antwort.
Ich würde versuchen ein 4. byte nach der Flagge.Meine Vermutung ist, dass Ihr C++ - compiler ist die Ausrichtung der Werte in Wort Grenzen.Das "ausrichten" der C# - version als auch.