这是我的C ++结构(文档说每个实例的大小必须恰好是10个字节):
#pragma pack (1)
struct LaserPoint {
WORD x;
WORD y;
byte colors[6];
};
我制作了以下C#结构:
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
public UInt16 x; // 2 bytes
public UInt16 y; // 2 bytes
public byte[] colors; // 6 bytes
}
这是我的C#项目中的完整测试代码:
using System;
using System.Runtime.InteropServices;
namespace StructSizeTest {
class Program {
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
public UInt16 x; // 2 bytes
public UInt16 y; // 2 bytes
public byte[] colors; // byte[6] = 6 bytes
}
static void Main(string[] args) {
LaserPoint point = new LaserPoint();
point.x = (UInt16)16384;
point.y = (UInt16)32768;
point.colors = new byte[6];
point.colors[0] = 255;
point.colors[1] = 255;
point.colors[2] = 255;
point.colors[3] = 255;
point.colors[4] = 255;
point.colors[5] = 255;
Console.WriteLine("LaserPoint.Size: " + Marshal.SizeOf(point));
Console.ReadLine();
}
}
}
这是控制台上的输出:
LaserPoint.Size: 8
为什么point
大小为8个字节而不是10个字节?
UInt16 = 2 bytes
UInt16 = 2 bytes
byte[6] = 6 bytes
Total = 10 bytes ?
我在这里想念的是什么?
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
public UInt16 x; // 2 bytes
public UInt16 y; // 2 bytes
public byte[] colors; // 6 bytes
}
byte[] colors
不是6个字节宽。它甚至不是实际的数组,而是对堆上字节数组的引用。根据您的平台,它的大小为32位(4字节)或64位(8字节)(在内部,它是一个指针)。这就是为什么结果为8字节(2字节+ 2字节+ 4字节)的原因。在64位平台上,您将获得12字节(2 + 2 + 8)的大小。
要使struct
行为类似于C ++,请struct
添加MarshalAsAttribute
并指定UnmanagedType.ByValArray
和SizeConst
:
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct LaserPoint {
public UInt16 x;
public UInt16 y;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] colors;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句