当前位置: 首页 > 编程语言 > C#

如何在C#中存储从C++函数返回的uint8_t-变量?Share

时间:2023-04-10 15:40:44 C#

如何在C#中存储从C++函数返回的uint8_t*变量?我正在从我的C#程序中调用C++DLL。DLL由几个函数组成,除了这个函数之外,我可以调用其中的大部分函数。C++函数如下所示:__declspec(dllexport)uint8_t*myHash(constchar*filename){uint8_t*hash=(unsignedchar*)malloc(72*sizeof(uint8_t));//对hash的一些处理returnhash;}从上面的代码可以看出,哈希函数存储的是一个字符数组。我想在我的C#程序中接收值,但我做不到。我的C#代码如下所示:[DllImport("myHash.dll",CharSet=CharSet.Ansi)]publicstaticexternIntPtrmyHash(stringfilename);IntPtrptr=myHash(fileA);字符[]结果=新字符[72];Marshal.Copy(ptr,result,0,72);问题是C#中的char是16位字符元素。您的C++代码返回一个8位uint8_t值数组。您应该改用字节数组。[DllImport("myHash.dll",CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Ansi)]publicstaticexternIntPtrmyHash(字符串文件名);....IntPtrptr=myHash(fileA);字节[]结果=新字节[72];Marshal.Copy(ptr,result,0,72);我指定了一个调用约定,因为正如所写的那样,您的函数是__cdecl。也许您在转录问题时遗漏了某些内容,但是上面的语句与问题中的非托管代码相匹配。这个函数被更好地设计为允许调用者分配缓冲区。这避免了您必须从C++代码中导出deallocator。我会这样写C++:__declspec(dllexport)intmyHash(constchar*filename,uint8_t*hash){//计算散列并复制到提供的缓冲区return0;//返回值是错误代码}和相应的C#代码:[DllImport("myHash.dll",CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Ansi)]publicstaticexternintmyHash(stringfilename,byte[]hash);....byte[]hash=newbyte[72];intretval=myHash(fileA,hash);此函数在其接口中硬编码,缓冲区长度为72。这可能是合理的,但传递缓冲区长度也很有意义,以便非托管代码防止缓冲区溢出。请注意,尽管您将此函数的输出称为字符数组,但使用uint8_t*会使它看起来更像字节数组。如果它确实是一个字符数组,那么你可以使用Encoding.GetString()转换为字符串。以上是C#学习教程:如何在c#中存储C++函数返回的uint8_t*变量?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: