1

私はパケットを構造体に入れる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 です。Int32 ではないこれら 3 つのメンバーの前の値は、C++ の値と同じです (C++ プロジェクトと C# プロジェクトの両方に同じパケットを挿入します)。

ただし、これらの 3 つのメンバーは異なる値を持っています。

C++ の値は (正しい):

  1. シード数:0x00000079
  2. シードCRC:0x000000d1
  3. シードセキュリティ:
  4. -[0]:0x548ac099
  5. - 1 :0x03c4d378
  6. -[2]:0x292e9eab
  7. -[3]:0x4eee5ee3
  8. -[4]:0x1071206e

C# の値は (正しくありません):

  1. シード数:0xd1000000
  2. シードCRC:0x99000000
  3. シードセキュリティ:
  4. -[0]: 0x78548ac0
  5. - 1 : 0xab03c4d3
  6. -[2]: 0xe3292e9e
  7. -[3]: 0x6e4eee5e
  8. -[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};

詳細については、ここをクリックしてください

構造体の最後の 3 つのメンバーが異なるのはなぜですか?また、それらを修正する方法は?

前もって感謝します!

4

2 に答える 2