将C#3D数组作为1D字节数组传递给C ++库

时间:2012-10-08 14:17:12

标签: c# c++ visual-c++ dll c#-3.0

我有一个C#应用程序,我创建了一个3D Int16(短)数组。想要将此3D数组传递给c ++库,以便以1D字节数组的形式将此数据设置为对象。因此,场景要么是在将数据传递给库之前将其转换,要么在库本身中进行转换。

  • 我知道如何在C#中将3D Int16数组转换为1D字节数组,但我不知道如何使用C ++转换它?
  • 哪一个会更快C ++或C#,关于我在C#中使用ConvertAll
  • 内存是否会加倍,或者我可以将C ++库中对象的数据设置为指向C#中的相同卷?

1 个答案:

答案 0 :(得分:2)

  

我知道如何在C#中将3D Int16数组转换为1D字节数组,但我知道   不知道如何使用C ++转换它?

这取决于您希望如何在一维数组中排列行,列和深度。我没有看到任何转换它的理由,因为你可以按照你想要的方式随机访问元素。当您不需要时,没有理由承担此类操作的费用。如果您不将其存储在文件中或通过网络发送,我无法理解您为什么要序列化它。

为什么你不能这样做:

__declspec( dllexport ) void cppMatrixCode(__int16*** matrix_3d, int width, int height, int depth)
{
   //manipulate the matrix with matrix_3d[the row you want][col you want][depth you want]

   //or to serialize:
   for(int i = 0; i < width; i++)
     for(int j = 0; j < height; j++)
       for(int k = 0; k < depth; k++)
       {
         _int16 value = matrix_3d[i][j][k];
         //now add value to another array or whatever you want.
       }
}

in C#
[DllImport("YourDLLGoesHere")]
static extern void cppMatrixCode(short[,,] matrix_3d, int width, int height, int depth);

short[,,] matrix = new short[width, height, depth];
//add your values to matrix
cppMatrixCode(matrix, width, height, depth);

这应仅在32位系统上复制128个字节,或在64位系统上复制160个字节。

  

哪一个会更快C ++或C#,关于我使用ConvertAll   C#?

这取决于您正在做什么,但编写良好的C ++代码通常比CLI代码更快。

  

内存是否会加倍,或者我可以设置对象的数据   C ++库指向我在C#中的相同卷?

您应该能够通过引用将C#byte []传递给c ++函数,而无需复制任何数据。但是,我们需要更多详细信息来确定您要做什么。