3

我需要将非托管内存读入托管字节数组。

为此,我有一个对非托管内存的 IntPtr 引用和一个表示我感兴趣的非托管内存大小的长度。

我使用以下代码将其读入托管字节数组。

            byte[] pixelDataArray = new byte[pixelDataLength];
            for (int i = 0; i < pixelDataLength; i++) {
                pixelDataArray[i] = Marshal.ReadByte(pixelData, i);
            }

但是,这会导致性能非常差。使用 256KB 的非托管内存调用此方法 1000 次,耗时超过 7 秒。我认为必须有一种更有效的方法来做到这一点。

我不能使用 Marshal.PtrToStructure 因为我不知道需要预先读取的内存大小。

关于如何提高此功能的性能的任何想法?

4

2 回答 2

6

不要循环尝试复制整个块:

Marshal.Copy(pixelData, pixelDataArray, 0, pixelDataLength);
于 2011-09-23T06:23:56.880 回答
3

使用Marshal.Copy().

byte[] pixelDataArray = new byte[pixelDataLength];
Marshal.Copy(pixelData, pixelDataArray, 0, pixelDataArray.Length);
于 2011-09-23T06:24:42.527 回答