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

Posted

技术标签:

【中文标题】将 C# 3D 数组作为 1D 字节数组传递给 C++ 库【英文标题】:Passing C# 3D array to C++ library as 1D byte array 【发布时间】:2012-10-08 14:17:11 【问题描述】:

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

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

【问题讨论】:

你所说的 C++ 是指托管 C++ 吗? 假设一个 M X N X R 矩阵,您是在谈论将其转换为大小为 MNR 的一维数组并将其传递给 C++ 函数吗?为什么不能只将 WORD*** 传递给 c++ 函数?这是 CLI C++ 还是标准 C++? 服务器[c++] 中的对象以字节[] 形式获取数据 【参考方案1】:

我知道如何在 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++ 函数,而无需复制任何数据。不过,我们需要更多关于您到底想要做什么的详细信息。

【讨论】:

在客户端应用程序中,我有一个表示体积数据的 3D 数组。服务器以任何形式获取数据并将其转换为 1D 字节数组以将其传递给 3D 体积对象 [muvolumeobj.Data=1D 字节数组],因为服务器是用 C++ 编写的,我有两种方法,要么转换 3D数组到 1D 字节 [] 然后将其传递给服务器,或者只是将 3D 数组传递给服务器,它会处理它。注意:在 clinet 中我需要数据是 3D 来处理其他一些模块,如 MPR跨度>

以上是关于将 C# 3D 数组作为 1D 字节数组传递给 C++ 库的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dllimport 将一个非常大的字符串作为字节数组从 C++ 传递到 C#

将字节数组从 C# 传递到 C++ DLL 作为 char*

将字节数组传递给 oracle 存储过程

将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?

如何将2D像素数组传递给BitmapSource.Create()?

将字符串数组作为缓冲区传递给 C++ 到 C#