如何将此struct / union从C ++代码转换为我的C#-UWP代码?重要的是,逻辑和引用不会改变,因为必须将此结构发送到服务器。
的区别hf_price
_HEADER_TYPE是一个枚举:
typedef struct _HEADER
{
_HEADER_TYPE HeaderType;
ULONG cc;
union
{
struct
{
LONG Protocol;
_TYPE CType;
_INFO InfoDesired; // -> that's another struct
LONG ResolutionX[MAX_]; // -> how do i initialize an array in c# with maximum size ?
LONG ResolutionY[MAX_];
} Identification;
struct
{
LONG Width;
_TYPE Type;
_INFO Info; // -> that's another struct
} Buffer;
} u;
} _HEADER, *_HEADER;
_INFO是一个结构:
public enum _HEADER_TYPE
{
_HEADER_TYPE_IDENTIFICATION,
_HEADER_TYPE_PING
}
TJ是一个枚举:
public struct _INFO
{
public TJ S;
public long Q;
public long R1;
}
_TYPE是一个枚举:
public enum TJSAMP
{
_44,
_42
}
到目前为止我尝试过的(C#代码):
public enum _TYPE
{
_OFF
_ON
}
这与上面的c ++结构完全相同吗?
答案 0 :(得分:0)
这是我得到的,假设一个打包的布局(情况并非总是这样,你需要检查你的C ++代码):
public class Program
{
public static void Main()
{
Console.WriteLine($"sizeof(_INFO): {Marshal.SizeOf(typeof(_INFO))}");
Console.WriteLine($"sizeof(Identification): {Marshal.SizeOf(typeof(Identification))}");
Console.WriteLine($"sizeof(Buffer): {Marshal.SizeOf(typeof(Buffer))}");
Console.WriteLine($"sizeof(_HEADER): {Marshal.SizeOf(typeof(_HEADER))}");
Console.WriteLine();
Console.WriteLine("To prove that it behaves union-like:");
var header = new _HEADER();
header.Identification.Protocol = 5;
Console.WriteLine($"header.Identification.Protocol: {header.Identification.Protocol}");
Console.WriteLine($"header.Buffer.Width: {header.Buffer.Width}");
}
public const int MAX_ = 10;
}
public enum TJ { _44, _42 }
public enum _TYPE { _OFF, _ON }
public enum _HEADER_TYPE { _HEADER_TYPE_IDENTIFICATION, _HEADER_TYPE_PING }
[StructLayout(LayoutKind.Explicit, Pack=4, Size=20)]
public struct _INFO
{
[FieldOffset(0)] public TJ S;
[FieldOffset(4)] public long Q;
[FieldOffset(12)] public long R1;
}
[StructLayout(LayoutKind.Explicit, Pack=4, Size=32+2*8*Program.MAX_)]
public struct Identification
{
[FieldOffset(0)] public long Protocol;
[FieldOffset(8)] public _TYPE CType;
[FieldOffset(12)] public _INFO InfoDesired;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = Program.MAX_)]
[FieldOffset(32)] public long[] ResolutionX;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = Program.MAX_)]
[FieldOffset(32 + Program.MAX_ * 8)] public long[] ResolutionY;
}
[StructLayout(LayoutKind.Explicit, Pack=4, Size=32)]
public struct Buffer
{
[FieldOffset(0)] public long Width;
[FieldOffset(4)] public _TYPE Type;
[FieldOffset(12)] public _INFO Info;
}
[StructLayout(LayoutKind.Explicit, Pack=4, Size=204)]
public struct _HEADER
{
// First slot (4 bytes)
[FieldOffset(0)] public _HEADER_TYPE HeaderType;
// Second slot (8 bytes)
[FieldOffset(4)] public ulong cc;
// The next 2 structs share the third slot (204 bytes)
[FieldOffset(12)] public Identification Identification;
[FieldOffset(12)] public Buffer Buffer;
}
输出:
sizeof(_INFO): 20
sizeof(Identification): 192
sizeof(Buffer): 32
sizeof(_HEADER): 204
To prove that it behaves union-like:
header.Identification.Protocol: 5
header.Buffer.Width: 5
值得注意的是:
enum
基本上是int
,因此它使用4个字节; long
使用8个字节; FieldOffset
的参数以字节为单位;