我正在通过一个byte[]
从 C# 到 C++ DLL
在 C++ DLL 中,我需要调用一个接受和读取的函数istream
对象,我打算收到byte[]
从 C# 为char*
并将其转换为istream
,
C++ DLL
extern "C" _declspec(dllexport) bool CheckData(char* data, int dataLength)
C#
[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CheckData(byte[] incoming, int size);
public void Process(byte[] bytes)
{
CheckData(bytes, bytes.Length);
}
虽然它看起来工作正常,但我发现等效的数据类型byte[]
is unsigned char*
在C++中,我想改为unsigned char*
但最stream
在 C++ 中适用于char*
not unsigned char*
我想问一下
1) 两种数据类型char*
and unsigned char*
都是1个字节,后面发生了什么?如果我继续使用是否有任何潜在的问题byte[]
with char*
?
2)如果出现问题,应该如何使用unsigned char*
构建一个istream
object?
事实上,char *
and unsigned char *
类型大小不是 1 个字节,而是 4 个字节,假设我们正在讨论 win32 应用程序:这些是指针,并且无论指向的数据大小如何,所有指针都具有相同的大小。
当 P/Invoke 机制将“简单值”数组视为函数参数时,它会很乐意将指向数组开头的指针提供给下面的 C 函数。毕竟这一切really从 DLL 中的信息了解 C 函数是其代码开始的地方。据我所知,参数的数量和类型未编码在符号名称中,因此它信任您提供的信息。这意味着即使你给它喂了int
array,对 C 函数的实际调用将会起作用,因为压入堆栈的参数的大小(指针和 int)与函数的 ABI 匹配。当然,处理可能是错误的,因为尺寸不匹配。
也可以看看https://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx了解有关所发生情况的更多详细信息。
处理是两者之间的区别unsigned char
and char
来了:如果在 C# 大小上你做一些数学计算byte
值(范围0-255),将其传递到C端,其中char
预期值(-128 到 127)
做更多的数学计算,可能会出错。如果它只是将其用作移动数据的一种方式,那就没问题了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)