C#中调用C++写的dll 中一个返回string的函数,结果返回是乱码 50
C++中函数定义typedefunsignedintb;char*fnBytToString(byteb[])C#使用:usingSystem.Runtime.Inter...
C++中函数定义typedef unsigned int b;
char* fnBytToString(byte b[] )
C#使用:using System.Runtime.InteropServices;
[DllImport("BytToString.dll", EntryPoint = "?fnBytToString@@YAPADQAI@Z" ,CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern StringBuilder fnBytToString(int[] b);
StringBuilder sb=fnBytToString(b);
测试用数组:int b[]={1,2,3,4,5,6,7,8,9,0}
返回的sb为:葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺
经检查:问题就出在把 char*返回给C#调用者的时候,CharSet无论选哪一个值都是错的。
请高人指点
问题解决了,但感觉有点别扭,希望大家来指点一下。小弟刚学C++,好多不懂的地方,大家就来指点指点嘛,
怎么我问的问题都没什么人来回答?分少了?还是我的叙述有问题...代码发一下(C#中用StringBuilder类型接收返回的数据),希望大家给点意见
typedef unsigned int byte;
char buff[MAX_LONGTH]; /* 全局缓冲区 */
extern "C" BYTTOSTRING_API char* fnBytToString(byte b[] )
{
char strItem[7];
memset(strItem,'0',sizeof strItem);
string s="";
for(int j=0;j<10;j++)
{
sprintf_s(strItem,"0x%04x",*b++);
s.append(strItem);
s.append(" ");
}
strcpy_s(buff,(char*)s.c_str());
return buff;
} 展开
char* fnBytToString(byte b[] )
C#使用:using System.Runtime.InteropServices;
[DllImport("BytToString.dll", EntryPoint = "?fnBytToString@@YAPADQAI@Z" ,CharSet=CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern StringBuilder fnBytToString(int[] b);
StringBuilder sb=fnBytToString(b);
测试用数组:int b[]={1,2,3,4,5,6,7,8,9,0}
返回的sb为:葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺
经检查:问题就出在把 char*返回给C#调用者的时候,CharSet无论选哪一个值都是错的。
请高人指点
问题解决了,但感觉有点别扭,希望大家来指点一下。小弟刚学C++,好多不懂的地方,大家就来指点指点嘛,
怎么我问的问题都没什么人来回答?分少了?还是我的叙述有问题...代码发一下(C#中用StringBuilder类型接收返回的数据),希望大家给点意见
typedef unsigned int byte;
char buff[MAX_LONGTH]; /* 全局缓冲区 */
extern "C" BYTTOSTRING_API char* fnBytToString(byte b[] )
{
char strItem[7];
memset(strItem,'0',sizeof strItem);
string s="";
for(int j=0;j<10;j++)
{
sprintf_s(strItem,"0x%04x",*b++);
s.append(strItem);
s.append(" ");
}
strcpy_s(buff,(char*)s.c_str());
return buff;
} 展开
3个回答
展开全部
以前遇到过这样的情况,是C++的编码和C#的编码不一致导致的,两个得用同一种编码规则才可以。
c++的默认编码好像是Ansy,C#的是unicode。
CString strRecieveStr;
for(i=0;i<m_RecieveFrameHead.i16BufLenth;i++)
{
m_RecieveFrameHead.bDataBuf[i]=pFrameHeadStr->bDataBuf[i];
}
m_RecieveFrameHead.bDataBuf[i]=0;
strRecieveStr.Format("%s",m_RecieveFrameHead.bDataBuf);
你把返回的数据先转成CString的。应该就可以了。
上面的代码是我以前一个项目中的,很长时间了,m_RecieveFrameHead就是C#传来的数据,要转成CString的就可以了。
c++的默认编码好像是Ansy,C#的是unicode。
CString strRecieveStr;
for(i=0;i<m_RecieveFrameHead.i16BufLenth;i++)
{
m_RecieveFrameHead.bDataBuf[i]=pFrameHeadStr->bDataBuf[i];
}
m_RecieveFrameHead.bDataBuf[i]=0;
strRecieveStr.Format("%s",m_RecieveFrameHead.bDataBuf);
你把返回的数据先转成CString的。应该就可以了。
上面的代码是我以前一个项目中的,很长时间了,m_RecieveFrameHead就是C#传来的数据,要转成CString的就可以了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不了解你该程序干嘛的。
只是想告诉你:
当使用StringBuilder时,请注意,应在构造StringBuilder对象时指明初始容量,否则默认容量是16个字符,当由于追加字符而超出默认容量时,就会分配一个新的串缓冲区,大小是原缓冲区的两倍。
举例说明:
public static string Reverse(string str)
{
if (string.IsNullOrEmpty(str))
{
throw new ArgumentException("参数不合法");
}
StringBuilder sb = new StringBuilder(str.Length);
for (int index = str.Length - 1; index >= 0; index--)
{
sb.Append(str[index]);
}
return sb.ToString();
}
只是想告诉你:
当使用StringBuilder时,请注意,应在构造StringBuilder对象时指明初始容量,否则默认容量是16个字符,当由于追加字符而超出默认容量时,就会分配一个新的串缓冲区,大小是原缓冲区的两倍。
举例说明:
public static string Reverse(string str)
{
if (string.IsNullOrEmpty(str))
{
throw new ArgumentException("参数不合法");
}
StringBuilder sb = new StringBuilder(str.Length);
for (int index = str.Length - 1; index >= 0; index--)
{
sb.Append(str[index]);
}
return sb.ToString();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
绝招,用去吧!
web.config里,
<system.web>节中,加上:
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312"/>
web.config里,
<system.web>节中,加上:
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312"/>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询