C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++

Posted

技术标签:

【中文标题】C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++【英文标题】:C/C++ - How can I convert Buffer.BlockCopy (C#) to C/C++ 【发布时间】:2014-02-18 21:32:00 【问题描述】:

我在C#中有如下函数:

public Matrix<float> ConcatDescriptors(IList<Matrix<float>> descriptors)

    int cols = descriptors[0].Cols;
    int rows = descriptors.Sum(a => a.Rows);

    float[,] concatedDescs = new float[rows, cols];

    int offset = 0;

    foreach (var descriptor in descriptors)
    
        // append new descriptors
        Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);
        offset += sizeof(float) * descriptor.ManagedArray.Length;
    

    return new Matrix<float>(concatedDescs);

我正在尝试将其翻译为CC++。我认为这很简单,但是,我被卡住了:

Buffer.BlockCopy(descriptor.ManagedArray, 0, concatedDescs, offset, sizeof(float) * descriptor.ManagedArray.Length);

如何在CC++ 中重新创建同一行代码?

【问题讨论】:

【参考方案1】:

在 C 中,等价于 memcpy

在 C++ 中你仍然可以使用memcpy,还有std::copy

请注意,C 和 C++ 允许指针(或迭代器)进入数组的中间,因此虽然 C# 将句柄传递给整个数组和起始索引,但在 C 和 C++ 中,您需要进行指针运算以找到调用函数之前的开始。

还要注意字节数与对象数。 Buffer.BlockCopy 测量起始索引和项目数(以字节为单位)。 memcpy 也以字节为单位测量项目数。 std::copy 在元素中测量。并且 C 和 C++ 指针算术对元素的数量进行操作。如果您首先将指针转换为char*,那么元素和字节将变得相同。 (C 和 C++ char 正好是一个字节,不像 C# char 更像 C++ wchar_t

【讨论】:

以上是关于C/C++ - 如何将 Buffer.BlockCopy (C#) 转换为 C/C++的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Cython 生成的模块从 python 导入 C/C++ 主文件? (用 C/C++ 编程)[关闭]

如何将c/c++回调函数转换为delphi

c / c ++如何将short转换为char

如何将C语言的输出倒入Excel工作表

如何将 Eclipse 从 Java 切换到 C/C++?

如何让 Visual Studio 2010 将文件扩展名识别为 C#/ASPX/C/C++ 文件?