情景:使用C++开发了一个动态链接库DLL,有一个开放的接口,实现内容是将C#传入的字符串进行异或加密,然后将加密后的字符串返回,定义如下
C++
//data传入参数
//eData加密后的字符串
extern "C" __declspec(dllexport) int __stdcall Encrypt(const wchar_t* data, wchar_t* eData);
代码实现很简单,将C#传入的字符串每一个字符进行异或后放到eData中返回
C#
[DllImport("Encrypt.dll", EntryPoint = "Encrypt", SetLastError = true, CharSet = CharSet.Unicode,
ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
extern static int Encrypt(string data, string eData);
现在问题来了,如果我使用如上定义,通过string传递,一切正常,但是如果改成如下定义,使用stringbuilder,那么可能会在后面多1个字符,这个多的字符还不一定是什么
extern static int Encrypt(string data, StringBuilder eData);
因为内部仅仅是对每一位字符进行异或,所以data和eData的长度应该是一致的,初始化StringBuilder时,就是按照data的长度去初始化,可是返回时,StringBuilder的长度可能会多
1个随机字符,这是怎么回事,本人C++纯自学了几天,很多还不是太清楚
确保c++的字符编码和C#中的一致,你定义的是Unicode。 c++ 的wchar_t*
使用的编码就是Unicode 它和char*
的编码是不一样的。
C# 传入C/C++动态链接库的参数对应是有规定的。C/C++ 的 char*
或者wchar_t*
对应C#中的类型就是string ,而StringBuilder 内部实际是一个char数组,以及其他属性,比如m_ChunkLength
,m_ChunkOffset
等等。 我觉得使用StringBuilder传入参数,很容易出问题的。
好吧,用string的话是没问题的,我只是想知道这里面的原理,为什么用stringbuilder前面内容都对,根据传入内容不一样,会导致stringbuilder后面结尾多0-2个字符出来
@MSky: 多出来的字符是什么呢?