gpt4 book ai didi

c# - 具有另一个结构的固定大小数组的结构

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:31 24 4
gpt4 key购买 nike

如何在 C# 中使用另一个结构的固定大小数组声明一个结构?我需要 this声明以便它工作。或者如果我想要创建位图信息(-header),我的方法是错误的吗?

[StructLayout(LayoutKind.Sequential)]
public struct RGBQUAD
{
public byte b;
public byte g;
public byte r;
public byte reserved;
}

[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPStruct, SizeConst = 1)]
public RGBQUAD[] bmiColors;
}

编辑:我自己学到的是 UnmanagedType.ByValArraySizeConst = 1 在这里很重要,以保持 BITMAPINFO如果我分配 256 大小的 RGBQUAD 数组,则在 44 字节事件中不断编码大小。

编辑 2:但 SizeConst 不能小于实际数组大小,否则非托管代码可能会使应用程序崩溃。

最佳答案

不幸的是(考虑到 .net 的设计目标之一是促进与 COM 的互操作,恕我直言有点令人惊讶).net 运行时不理解除独立 System.Array 之外的任何类型的数组> 对象或内置于 System.String 中的字符数组。尽管 C# 提供了固定数组类型,但这些类型是使用指针算法以 .net 运行时无法真正理解且无法验证的方式进行操作的。

通过定义一个包含元素a0a1a2、等等,并编写一个索引属性,该属性使用 switch 语句或其他此类结构来访问其中的元素,但此类结构的执行速度可能比普通数组慢得多。

如果您不需要使用安全代码(考虑到您正在与可能不受信任的托管代码进行互操作,“安全”代码可能不是一个考虑因素)我' d 建议您使用显式布局定义您的 RGBQUAD,将 int 与您的其他数据重叠,然后让您的其他结构包含一个 fixed int[whateverSize] ; 来保存 RGB 数据。它的索引访问器应该能够将 int 转换为 RGBQUAD,而只需读/写它的“int”成员即可。

关于c# - 具有另一个结构的固定大小数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15071775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com