在C#中,是否可能在同一内存位置有多个数组,而这些数组具有不同的类型? 我有一个很大的浮点数组,我需要在尽可能短的时间内将它转换为字节array. 我的 idea 是有一个指向Float数组开头的字节数组,这样如果我更改Float数组,字节数组也会自动更改,但我还没有找到这样做的解决方案. 在C#中这是可能的吗,或者我必须找到其他方法吗?
我需要字节数组是一个类型为"byte[]"的实际数组,因为我必须调用一个我无法访问的库中的函数.
在C#中,是否可能在同一内存位置有多个数组,而这些数组具有不同的类型? 我有一个很大的浮点数组,我需要在尽可能短的时间内将它转换为字节array. 我的 idea 是有一个指向Float数组开头的字节数组,这样如果我更改Float数组,字节数组也会自动更改,但我还没有找到这样做的解决方案. 在C#中这是可能的吗,或者我必须找到其他方法吗?
我需要字节数组是一个类型为"byte[]"的实际数组,因为我必须调用一个我无法访问的库中的函数.
actual arrays不能做到这一点(至少内存中的元素大小不同)--但如果您乐于使用Span<T>
,那么MemoryMarshal
可能就是您想要的.(您仍然可以使用数组作为底层存储.)
例如:
using System.Runtime.InteropServices;
Span<float> floats = new float[3];
Span<byte> bytes = MemoryMarshal.AsBytes(floats);
Console.WriteLine(bytes[0]); // 0
floats[0] = 1.234f;
Console.WriteLine(bytes[0]); // 182
bytes[0] = 200;
Console.WriteLine(floats[0]); // 1.2340021
或者相反,保持byte[]
变量,但使用Span<float>
作为字节数组的浮点型视图:
using System.Runtime.InteropServices;
byte[] bytes = new byte[100];
Span<float> floats = MemoryMarshal.Cast<byte, float>(bytes);
Console.WriteLine(bytes[0]); // 0
floats[0] = 1.234f;
Console.WriteLine(bytes[0]); // 182
bytes[0] = 200;
Console.WriteLine(floats[0]); // 1.2340021