C# 调用C++ char* 用 Marshal.ptrtostringansi 转换乱码
C++接口函数原型int callservice(const char* bke056, const char* bke057, const char* bke059,
char* bke058, char* bke060, Integer AppCode, char* ErrorMsg)
//C#动态引用DLL文件
[DllImport("HISSICP3.dll", CharSet = CharSet.Auto, SetLastError = true, EntryPoint = "callservice")]
public static extern int callservice([MarshalAs(UnmanagedType.LPStr)] string bke056,
[MarshalAs(UnmanagedType.LPStr)] string bke057, [MarshalAs(UnmanagedType.LPStr)] string bke059,out string bke058, out string bke060, out int AppCode, out string ErrorMsg);
#region 输入参数
public string inputXmlParam = "";
private string bke056 = "71"; //交易类别代码
private string bke057=string.Empty; //交易流水号
private string bke059=string.Empty; //输入XML
private static IntPtr bke058; //交易验证码
private static IntPtr bke060; //交易输出xml
#endregion
#region 输出参数
public static string outXmlParam; //输出XML
public static int appCode = 0; //执行编码
public static IntPtr msgError; //错误信息
#endregion
/// <summary>
/// 读卡信息
/// </summary>
public void ReadCard()
{
try
{
bae056 = Common.bae056;
aka130 = Common.aka130;
EncodeInputParamToXml(); //调用输入XMl方法
bke059 = inputXmlParam; //XML 赋值
IntPtr retValue = YHInterfaceCls.callservices(bke056, bke057, bke059,ref bke058,ref bke060, ref appCode,ref msgError);
if (retValue != null && appCode == 1) //成功
{
string s = Marshal.PtrToStringAnsi(bke060); //乱码1
string ss = Marshal.PtrToStringAuto(bke060); //乱码2
string ssss = Marshal.PtrToStringUni(bke060); //乱码2
string sss = Marshal.PtrToStringBSTR(bke060); //报错
isSuccess = true; //初始化标识设为真
outXmlParam = Convert.ToString(s);
DecodeOutXmlParam(); //调用输出XML
//bke060 = outXmlParam; //赋值
}
bke060取出来的是一串数字1836597052,一用string s = Marshal.PtrToStringAnsi(bke060);or string ssss = Marshal.PtrToStringUni(bke060); 转换就乱码。求大神回复! c# c++ 乱码 xml --------------------编程问答-------------------- 你声明的bke060是string类型的,不是IntPtr,怎么调Marshal.PtrToStringAnsi?
你直接string s = bke060;看看什么结果? --------------------编程问答-------------------- 这样试试看
IntPtr pointer = new IntPtr(Convert.ToInt32(bke060));//看起来1836597052是个指针地址
string s = Marshal.PtrToStringAnsi(pointer); --------------------编程问答-------------------- 哦!你好现在改回来了!还是一样的!
[DllImport("HISSICP3.dll", CharSet = CharSet.Ansi, SetLastError = true, CallingConvention = CallingConvention.Cdecl, EntryPoint = "callservice")]
public static extern IntPtr callservices([MarshalAs(UnmanagedType.LPStr)] string bke056, [MarshalAs(UnmanagedType.LPStr)] string bke057, [MarshalAs(UnmanagedType.LPStr)] string bke059,ref IntPtr bke058,ref IntPtr bke060, ref int AppCode,ref IntPtr ErrorMsg);
--------------------编程问答-------------------- 对呀!我也认为是个指针地址!那现在取出来的怎么会是乱码呢? --------------------编程问答-------------------- 你直接
IntPtr pointer = new IntPtr(1836597052);
string s = Marshal.PtrToStringAnsi(pointer);
看看啥结果?假设现在的bke060就是等于1836597052。当然,如果等于123456,你就写成
IntPtr pointer = new IntPtr(123456); --------------------编程问答-------------------- 好的哦!现在连接不上服务器!下午测试的时候再找你哈! --------------------编程问答-------------------- 你好!现在转换出来的不是乱码,而是Null..怎么回事哦? --------------------编程问答-------------------- 对于char*直接可以直接使用stringbuilder,
记得把stringbuilder给个长度,初始化下
补充:.NET技术 , C#