相关疑难解决方法(0)

在 C# 中,如何将 byte[] 重新解释为 T[],其中 T 是一个结构体?

我正在使用 C# (.NET 5)。想象一下,我有一个存储结构数组(例如浮点数)的类:

public class StoresArray
{
    private float[] floats;
}
Run Code Online (Sandbox Code Playgroud)

此类的数据是从序列化的二进制文件加载的。为了分配floats数组,我使用辅助函数从序列化文件中读取字节。重要的是,此函数然后尝试直接将加载的字节重新解释为而不是复制到新数组。float[]

public static class Deserializer
{
    public static float[] Load(string file)
    {
        byte[] bytes = LoadBytesFromFile(file);

        // This is a compiler error, of course.
        return (float[])bytes;
    }
}
Run Code Online (Sandbox Code Playgroud)

预期用途如下:

// Within the StoresArray class...
floats = Deserializer.Load("MyFile.file");
Run Code Online (Sandbox Code Playgroud)

这里值得注意的是,我试图将存储float[]为成员变量,而不仅仅是在byte[]本地迭代。因此,通过Span<T>( Span<float> floatSpan = MemoryMarshal.Cast<byte, float>(bytes.AsSpan())) 进行投射是不够的。Memory<T>与、Marshal、 和相关的功能MemoryMarshal也同样失败。当然,我可以使用跨度(以及其他方法,如或不安全的指针)从BitConverter …

c# arrays reinterpret-cast

7
推荐指数
1
解决办法
1698
查看次数

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

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

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

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

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

如果不可能,为什么?

谢谢,埃里克

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

c# arrays byte struct casting

4
推荐指数
1
解决办法
7220
查看次数

标签 统计

arrays ×2

c# ×2

byte ×1

casting ×1

reinterpret-cast ×1

struct ×1