我有一个C#应用程序,我创建了一个3D Int16(短)数组。想要将此3D数组传递给c ++库,以便以1D字节数组的形式将此数据设置为对象。因此,场景要么是在将数据传递给库之前将其转换,要么在库本身中进行转换。
ConvertAll
?答案 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 ++函数,而无需复制任何数据。但是,我们需要更多详细信息来确定您要做什么。