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):

  1. seedCount:0x00000079
  2. seedCRC:0x000000d1
  3. SeedSecurity:
  4. -[0]:0x548ac099
  5. -1:0x03c4d378
  6. -[2]:0x292e9eab
  7. -[3]:0x4eee5ee3
  8. -[4]:0x1071206e

in C# werden die Werte(falsch):

  1. seedCount:0xd1000000
  2. seedCRC:0x99000000
  3. SeedSecurity:
  4. -[0]:0x78548ac0
  5. -1:0xab03c4d3
  6. -[2]:0xe3292e9e
  7. -[3]:0x6e4eee5e
  8. -[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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top