C# - 将字节数组转换为结构数组,反之亦然(反向)

Eri*_*let 4 c# arrays byte struct casting

我想将 Color[] 保存到文件中。为此,我发现使用“System.IO.File.WriteAllBytes”将字节数组保存到文件应该非常有效。

我想以一种安全的方式将我的 Color[](结构数组)转换为字节数组:

  • 小端/大端的潜在问题(我认为不可能发生但想确定)
  • 有 2 个不同的指针指向指向不同类型的同一内存。垃圾收集是否知道该怎么做 - 移动对象 - 删除指针???

如果可能,最好有一种通用的方法将字节数组转换为任何结构(T 结构)数组,反之亦然。

如果不可能,为什么?

谢谢,埃里克

我认为这两个解决方案制作了一个我想避免的副本,而且它们都使用 Marshal.PtrToStructure 特定于结构而不是结构数组:

Tim*_*imo 6

从 .NET Core 2.1 开始,是的,我们可以!输入MemoryMarshal

我们会将我们的Color[]视为ReadOnlySpan<Color>. 我们将其重新解释为ReadOnlySpan<byte>. 最后,由于WriteAllBytes没有基于跨度的过载,我们使用 aFileStream将跨度写入磁盘。

var byteSpan = MemoryMarshal.AsBytes(colorArray.AsSpan());
fileStream.Write(byteSpan);
Run Code Online (Sandbox Code Playgroud)

作为一个有趣的旁注,您还可以[StructLayout(LayoutKind.Explicit)]在您的字段中尝试作为属性。它允许您指定重叠字段,有效地允许联合的概念。

是 MSDN 上的一篇博客文章,说明了这一点。它显示了以下代码:

[StructLayout(LayoutKind.Explicit)]
public struct MyUnion
{
    [FieldOffset(0)]
    public UInt16 myInt;

    [FieldOffset(0)]
    public Byte byte1;

    [FieldOffset(1)]
    public Byte byte2;
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,UInt16字段与两个Byte字段重叠。

这似乎与您尝试做的事情密切相关。除了Color高效写入所有字节(尤其是多个对象)的部分之外,它让您非常接近。:)