gpt4 book ai didi

c# - 字节数组 "Union"覆盖在 c# StructLayout.Explicit

转载 作者:太空狗 更新时间:2023-10-30 01:05:40 29 4
gpt4 key购买 nike

我想在 c# 结构类型中有一种 c 风格的 uion。

出于某种原因,每次分配我定义的类型时都会出现异常。这是我自己的类型。基本思想是我可以访问这个结构的“指针”。不幸的是我得到一个异常 TypeLoadException:

附加信息:无法从程序集“ManagedTarget,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”中加载类型“ManagedTarget.FngPeriodeParameterType”,因为它在偏移量 0 处包含一个对象字段,该字段未正确对齐或重叠一个非对象字段。

怎么了?

[StructLayout(LayoutKind.Explicit, Size = 16)]
unsafe internal struct FngPeriodeParameterType
{
[FieldOffset(0)]
public Byte[] ByteArray;

[FieldOffset(0)]
public UInt32 Repetitions;

[FieldOffset(4)]
public Int16 Amplitude;

[FieldOffset(6)]
public Int16 Offset;

[FieldOffset(8)]
public Int16 Gain;

[FieldOffset(10)]
public UInt16 Selection;

[FieldOffset(12)]
public UInt32 Step;
}

最佳答案

如果您的意图是ByteArray 是原始数据,那么它必须是一个固定 缓冲区;目前,它只是对堆上不相关 byte[] 的引用 - 您不能将引用和 uint 重叠>:

[FieldOffset(0)]
public fixed byte ByteArray[16];

不过,使用它可能会很痛苦;我通常添加辅助方法,例如:

public void ReadBytes(byte[] data)
{
fixed (byte* ptr = ByteArray)
{
for (int i = 0; i < 16; i++)
data[i] = ptr[i];
}
}

关于c# - 字节数组 "Union"覆盖在 c# StructLayout.Explicit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17926186/

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