首页 新闻 会员 周边

C#调用C++时使用stringbulider时长度会概率性变化,非常困惑

0
[已解决问题] 解决于 2019-04-04 09:56

情景:使用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++纯自学了几天,很多还不是太清楚

MSky的主页 MSky | 菜鸟二级 | 园豆:436
提问于:2019-04-02 09:13
< >
分享
最佳答案
0
  • 确保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传入参数,很容易出问题的。

奖励园豆:5
Shendu.CC | 老鸟四级 |园豆:2138 | 2019-04-02 10:39

好吧,用string的话是没问题的,我只是想知道这里面的原理,为什么用stringbuilder前面内容都对,根据传入内容不一样,会导致stringbuilder后面结尾多0-2个字符出来

MSky | 园豆:436 (菜鸟二级) | 2019-04-02 11:06

@MSky: 多出来的字符是什么呢?

Shendu.CC | 园豆:2138 (老鸟四级) | 2019-04-02 12:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册