1
6
这可能不是你要找的答案类型,但我无论如何都会把它贴出来。
基本上,它在apinstruct属性中进行打包/解包。 |
2
4
处理这类问题的最简单方法是沿着与位字段相同的行,只需将数据打包到适当数据类型的私有成员(或成员,如果很大的话),然后呈现为您解包数据的公共属性。解包操作非常快,对性能影响很小。对于您的特定类型,以下可能是您想要的:
对于某些结构,即使这种方法也不可行,因为结构的定义方式很不幸。在这些情况下,通常必须使用字节数组作为数据块,从中可以解包元素。 编辑:扩展我对这个简单方法无法处理的结构的意思。当您不能像这样简单地进行打包/解包时,您需要手动封送不规则结构。这可以在调用pinvoked API时使用手动方法或使用自定义封送拆收器来完成。下面是一个自定义marhsaler的示例,它可以很容易地适应现场手动编组。
对于这些结构的数组,除非数组大小是固定的,否则不能使用自定义封送处理,但是使用相同的技术将数组数据作为一个整体手动封送比较容易。 |
3
2
你确定吗 要求 具体的布局,还是只做8号的可以接受? 我这样问是因为布局如下
具有不对齐的字段,这可能是导致问题的原因。 如果你能“重新安排”事情,那么这可能对你有用:
当我在模拟器上用它进行测试时,它工作得很好。 显然,除非你愿意重新安排,否则你无能为力。 This answer 和 this old article 它强烈地表明,您必须至少在其大小的倍数上对齐结构(我尝试在偏移量2上对齐int,这也触发了错误) 考虑到您需要与外部定义的数据进行互操作,下面可能是您最简单的解决方案:
|
4
1
您需要发布一个更相关的示例。在该结构上设置packing无论如何都不会有任何效果。 我打赌您需要使用laoutkind.explicit,然后为每个成员提供偏移量。不管怎样,这比处理打包要好得多,因为对于查看原始开发人员明确表示要使事物不对齐的代码的人来说,这更明显。 沿着这些线的东西:
|
5
1
我认为应该采用StephenMartin的答案,使其接受T,并使用反射来一般地实现MarshalManagedTonative和MarshalNativeToManaged方法。然后,您将拥有一个自定义的打包结构封送拆收器,该封送拆收器可用于任何类型的结构。 代码如下:
|
6
0
特别地,
|
7
0
layoutKind.Explicit和FieldOffsetAttribute将允许您对pack属性执行任何操作。这些显式布局属性允许您指定结构中每个字段的确切字节位置(相对于结构内存范围的开始)。运行时使用pack属性来帮助确定使用顺序布局时每个字段的确切位置。pack属性没有其他效果,因此使用显式布局允许您模拟完全相同的行为,尽管更详细一些。如果你认为这不能解决你的问题,也许你可以发布更多关于你想做什么或者为什么你认为你需要使用pack属性的信息。 编辑:我刚刚注意到关于尝试将整个结构的大小调整为8字节的附加注释。是否尝试使用structlayoutattribute.size属性?与pack不同,它在紧凑框架中可用。 |