C# 将intptr转换为ulong数组

C# 将intptr转换为ulong数组,c#,pinvoke,phash,ulong,C#,Pinvoke,Phash,Ulong,我正在从C调用一个方法,如下所示: [DllImport(@"pHash.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr ph_dct_videohash(string file, ref int length); 这是我从库中调用的方法 ulong64* ph_dct_videohash(const char *filename, int &Length){ CI

我正在从C调用一个方法,如下所示:

[DllImport(@"pHash.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr ph_dct_videohash(string file, ref int length);
这是我从库中调用的方法

ulong64* ph_dct_videohash(const char *filename, int &Length){

    CImgList<uint8_t> *keyframes = ph_getKeyFramesFromVideo(filename);
    if (keyframes == NULL)
        return NULL;

    Length = keyframes->size();

    ulong64 *hash = (ulong64*)malloc(sizeof(ulong64)*Length);
    //some code to fill the hash array
    return hash;
}
如何从IntPtr读取ulong数组?

虽然没有提供任何直接处理ulong的方法,但它确实提供了一种方法,您可以使用它获取长数组,然后将值强制转换为ulongs

以下是我的作品:

[DllImport("F:/CPP_DLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
static extern IntPtr uint64method(string file, ref int length);

static ulong[] GetUlongArray(IntPtr ptr, int length)
{
    var buffer = new long[length];
    Marshal.Copy(ptr, buffer, 0, length);
    // If you're not a fan of LINQ, this can be
    // replaced with a for loop or
    // return Array.ConvertAll<long, ulong>(buffer, l => (ulong)l);
    return buffer.Select(l => (ulong)l).ToArray();
}

void Main()
{
    int length = 4;
    IntPtr arrayPointer = uint64method("dummy", ref length);
    ulong[] values = GetUlongArray(arrayPointer, length);
}

考虑只使用不安全代码:

IntPtr pfoo = ph_dct_videohash(/* args */);
unsafe {
    ulong* foo = (ulong*)pfoo;
    ulong value = *foo;
    Console.WriteLine(value);
}

我认为,如果你将导入的返回类型声明为ulong[],编译器和/或运行时将为你做一些不必要的工作。这是内存泄漏,必须有人调用free来再次释放内存。您无法进行该调用,因此无法pinvoke此函数。它的设计很差,应该为调用者提供传递缓冲区的选项。这样做很简单,也很有效率。我试着这么做,结果成功了error@Yuri因此,请修复您的代码,而不是选择错误的解决方案。在长时间的/ulong对话中,错误的值如何?许多返回值的值都大于长最大值value@YuriSchneider请考虑这一点:0xFFFFFFFFFFFFFF,它是一个64位整数的最大值,是1844 67407370955 1615作为一个无符号整数。当强制转换为有符号整数时,如果使用的有符号数表示形式是大多数系统使用2的补码,则该值变为-1。这都是关于表现的。基础数据在此不更改,因为ulong和long都是64位整数。@YuriSchneider如果您想自己查看,请将数组的一个值设置为0xFFFFFFFFFF。在C中,封送。复制数组。然后看看这个值是多少。然后将其转换为一个ulong并再次查看该值。再加上这个答案:如果您希望从数组中获取所有值,只需创建一个新的ulong数组并使用for循环即可。e、 g.新数组[i]=foo[i];