我正在尝试从C#(作为short [])到C ++(作为无符号short *)传递2D掩码(全为0,期望感兴趣的区域为1s),但是我无法在C ++中获得正确的值。

C#

[DllImport("StatsManager.dll", EntryPoint = "SetStatsMask")]
private static extern int SetStatsMask(IntPtr mask, int imgWidth, int imgHeight);

short[] mask;
mask = new short[8*8];
// some operation here making a ROI in mask all 1.  ex 0000111100000000 in 1D
IntPtr maskPtr = Marshal.AllocHGlobal(2 * mask.Length);
Marshal.Copy(mask, 0, maskPtr, mask.Length);
SetStatsMask(maskPtr, width, height);


C ++

long StatsManager::SetStatsMask(unsigned short *mask, long width, long height)
{
    //create memory to store the incoming mask
    //memcpy the mask to the new buffer
    //pMask = realloc(pMask,width*height*sizeof(unsigned short));

    long ret = TRUE;

    if (NULL == _pMask)
    {
        _pMask = new unsigned short[width * height];
    }
    else
    {
        realloc(_pMask,width*height*sizeof(unsigned short));
    }

    memcpy(mask,_pMask,width*height*sizeof(unsigned short));

    SaveBuffer(_pMask,  width,  height);

    return ret;
}


但是我只能使用52536而不是0000111100000000来在C ++中使用遮罩查看蒙版,所以我想知道我在哪里搞砸了?有人可以帮忙吗?谢谢。

最佳答案

我相信您放错了memcpy的参数:

memcpy(mask,_pMask,width*height*sizeof(unsigned short));


据我了解,您想从mask复制到_pMask,因此您应该写:

memcpy(_pMask, mask, width*height*sizeof(unsigned short));

09-19 06:11