首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将intptr转换为ulong数组

将intptr转换为ulong数组
EN

Stack Overflow用户
提问于 2015-07-11 03:57:52
回答 2查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
[DllImport(@"pHash.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr ph_dct_videohash(string file, ref int length);

下面是我从库中调用的方法

代码语言:javascript
复制
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数组

EN

回答 2

Stack Overflow用户

发布于 2015-07-11 04:54:09

虽然Marshal class没有提供任何直接处理ulong的方法,但它提供了Marshal.Copy(IntPtr, long[], int, int),您可以使用它来获取long数组,然后将值转换为ulongs。

下面的方法对我很有效:

代码语言:javascript
复制
[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);
}
票数 2
EN

Stack Overflow用户

发布于 2015-07-11 04:59:23

考虑使用不安全的代码:

代码语言:javascript
复制
IntPtr pfoo = ph_dct_videohash(/* args */);
unsafe {
    ulong* foo = (ulong*)pfoo;
    ulong value = *foo;
    Console.WriteLine(value);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31349268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档