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

Arrays C#--从指针创建托管数组,arrays,pointers,unmanaged,managed,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; //FAI

我正在尝试从字节数组创建一个托管的双精度数组。我目前的工作有问题,但我想优化。下面是一些我想使用的代码:

private unsafe static double[] _Get_Doubles(byte[] _raw_data)
{
    double[] ret;
    fixed (byte* _pd = _raw_data)
    {
        double* _pret = (double*)_pd;
        ret = (double[])*_pret; //FAILURE
    }
}
请告诉我如何处理这些问题


-Aaron

关于您发布的代码,需要注意的一个关键问题是,无法知道返回值指向了多少项,托管数组需要知道它有多大。您可以返回一个
double*
或创建一个
新的double[XXX]
并复制值,甚至(如果计数是常量)使用
公共固定双精度数据[2]创建一个
结构成员并将原始数据转换为该类型。

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

这可以通过重申以下问题来体现:

如何围绕“不安全”阵列创建托管阵列

由于受管阵列具有头信息(因为它是围绕内存卡盘的类),因此它需要比阵列本身更多的内存空间。因此,答案是:

根据受管阵列在内存中的存储方式,在阵列本身之前(和/或之后)分配空间,并在“不安全”阵列周围放置受管信息(长度等)

这是不容易做到的,因为保证阵列周围有足够的数据充其量是不可靠的。在我的特定示例中,可能有足够的空间容纳它,因为传递了一个托管字节[],这意味着数组周围有数据,但断言相同的数据适用于托管双精度[]充其量是可疑的,但很可能是错误的,而更改数据使其适用于托管双精度[]则是邪恶的

[编辑]

看起来像是封送。这里的方法是复制。创建一个新数组,让Marshal复制它们(希望他比我快,或者在以后的某个日期,他会更快):


通常在处理互操作时,封送员是您的朋友,在System.Runtime.InteropServices.Marshall为您服务。我不知道使用数组具体需要什么。但是,您可以使用指针算法访问数组。也许这会提示您进入正确的方向。@daGhost——我当然知道使用指针访问数组,但我必须研究编组托管数组。谢谢。@Limited Thing(请不要再叫我daGhost):如果你可以用指针访问数组元素,你可以将值复制到托管数组中。这基本上就是我最后要做的。我创建了一个固定长度的双数组,然后在其中一次复制一个值。最好是,在C++方式下,不分配新的双数组。是的,一个双[]和字节[]设置为重叠的结构,就像al、ax和eax寄存器一样,但是创建结构的开销可能比我正在做的要大……这可能会让你想,你到底为什么要在数组复制中如此复杂?对此,我的回答是。
var ret = new double[_raw_data.Length / sizeof(double)];
System.Runtime.InteropServices.Marshal.Copy(new System.IntPtr(_pret), ret, 0, ret.Length);