C# - 从指针创建托管数组

Lim*_*ent 9 arrays pointers unmanaged managed

我正在尝试从一个字节数组创建一个双重托管数组.我目前有问题,但我想优化.这是我想要使用的一些代码:

private unsafe static double[] _Get_Doubles(byte[] _raw_data)
{
    double[] ret;
    fixed (byte* _pd = _raw_data)
    {
        double* _pret = (double*)_pd;
        ret = (double[])*_pret; //FAILURE
    }
}
Run Code Online (Sandbox Code Playgroud)

请让我知道如何处理这些问题.

-Aaron

Lim*_*ent 3

刚才我以为这stackalloc是正确的方法,但失败了。最重要的是,我现在知道它注定要失败。没有办法做我想做的事。

这可以通过重申问题来看出:

如何围绕“不安全”数组创建托管数组?

由于托管数组具有标头信息(因为它是一个围绕内存块的类),因此它需要比数组本身更多的内存空间。所以,答案是:

在数组本身之前(和/或之后?取决于托管数组在内存中存储的方式)分配空间,并将托管信息(长度等)放在“不安全”数组周围。

这并不容易实现,因为要保证数组周围有足够的数据是不稳定的。在我的特定示例中,可能有足够的空间,因为传入的托管 byte[] 意味着数组周围有数据,但断言相同的数据适用于托管 double[] 充其量是可疑的,但大多数可能是错误的,并且更改数据以使其适合托管 double[] 是邪恶的。

[编辑]

看来这Marshal.Copy是去这里的路。创建一个新数组并让 Marshal 复制它们(希望他会比我快,或者也许稍后的某个时间,他会更快):

var ret = new double[_raw_data.Length / sizeof(double)];
System.Runtime.InteropServices.Marshal.Copy(new System.IntPtr(_pret), ret, 0, ret.Length);
Run Code Online (Sandbox Code Playgroud)