我想将类似C语言的union导出为字节数组,像这样:
我们得到的输出是
现在,如果我们将
奇怪的是,我们第一次想要的输出结果是
此外,如果我们交换原来的两个字段,我们再次得到了我们想要的相同的输出结果。(https://dotnetfiddle.net/ziSQ5W)
这是为什么?为什么字段的顺序很重要?有没有更好(可靠)的解决方案可以做同样的事情?
[StructLayout(LayoutKind.Explicit)]
struct my_struct
{
[FieldOffset(0)]
public UInt32 my_uint;
[FieldOffset(0)]
public bool other_field;
}
public static void Main()
{
var test = new my_struct { my_uint = 0xDEADBEEF };
byte[] data = new byte[Marshal.SizeOf(test)];
IntPtr buffer = Marshal.AllocHGlobal(data.Length);
Marshal.StructureToPtr(test, buffer, false);
Marshal.Copy(buffer, data, 0, data.Length);
Marshal.FreeHGlobal(buffer);
foreach (byte b in data)
{
Console.Write("{0:X2} ", b);
}
Console.WriteLine();
}
我们得到的输出是
01 00 00 00
,而不是预期的 EF BE AD DE
。(https://dotnetfiddle.net/gb1wRf)现在,如果我们将
other_field
类型更改为 byte
(例如)会发生什么?奇怪的是,我们第一次想要的输出结果是
EF BE AD DE
。(https://dotnetfiddle.net/DnXyMP)此外,如果我们交换原来的两个字段,我们再次得到了我们想要的相同的输出结果。(https://dotnetfiddle.net/ziSQ5W)
这是为什么?为什么字段的顺序很重要?有没有更好(可靠)的解决方案可以做同样的事情?