在 C# 中,是否可以将字节数组转换为另一种类型而不创建新数组?

use*_*186 3 c# arrays memory-management casting

我有一个 byte[] 对象,用作数据缓冲区。

我想将其“读取”为原始/非原始结构的数组,而不在内存中复制 byte[] 数据。

目标是这样的:

byte[] myBuffer;

//Buffer is populated

int[] asInts = PixieDust_ToInt(myBuffer);
MyStruct[] asMyStructs = PixieDust_ToMyStruct(myBuffer);
Run Code Online (Sandbox Code Playgroud)

这可能吗?如果是这样,怎么办?

Tim*_*imo 6

是否可以?实际上,是的!

从 .NET Core 2.1 开始,MemoryMarshal我们可以对跨度执行此操作。如果您对跨度而不是数组感到满意,那么是的。

var intSpan = MemoryMarshal.Cast<byte, int>(myByteArray.AsSpan());
Run Code Online (Sandbox Code Playgroud)

int 范围将包含 byteCount / 4 整数。

至于自定义结构......文档声称在转换的两侧都需要“原始类型”。但是,您可以尝试使用 aref struct并看到这是实际的约束。如果它有效的话我不会感到惊讶!

请注意,引用结构仍然有很大的限制,但这种限制对于我们正在讨论的重新解释类型转换是有意义的。

编辑:哇,约束没那么严格。它需要任何结构,而不是基元。它甚至不必是一个ref struct. 如果您的结构体在其层次结构中的任何位置包含引用类型,则只有一个运行时检查会抛出异常。这就说得通了。因此,这应该适用于您的自定义结构以及整数。享受!