当前位置:编程学习 > C#/ASP.NET >>

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);
--------------------编程问答--------------------
引用 2 楼 charju 的回复:
这样试试看

IntPtr pointer = new IntPtr(Convert.ToInt32(bke060));//看起来1836597052是个指针地址
string s = Marshal.PtrToStringAnsi(pointer);
对呀!我也认为是个指针地址!那现在取出来的怎么会是乱码呢? --------------------编程问答-------------------- 你直接
IntPtr pointer = new IntPtr(1836597052);
string s = Marshal.PtrToStringAnsi(pointer);

看看啥结果?假设现在的bke060就是等于1836597052。当然,如果等于123456,你就写成
IntPtr pointer = new IntPtr(123456); --------------------编程问答--------------------
引用 5 楼 charju 的回复:
你直接
IntPtr pointer = new IntPtr(1836597052);
string s = Marshal.PtrToStringAnsi(pointer);

看看啥结果?假设现在的bke060就是等于1836597052。当然,如果等于123456,你就写成
IntPtr pointer = new IntPtr(123456);
好的哦!现在连接不上服务器!下午测试的时候再找你哈! --------------------编程问答--------------------
引用 6 楼 u012332319 的回复:
Quote: 引用 5 楼 charju 的回复:

你直接
IntPtr pointer = new IntPtr(1836597052);
string s = Marshal.PtrToStringAnsi(pointer);

看看啥结果?假设现在的bke060就是等于1836597052。当然,如果等于123456,你就写成
IntPtr pointer = new IntPtr(123456);
好的哦!现在连接不上服务器!下午测试的时候再找你哈!
你好!现在转换出来的不是乱码,而是Null..怎么回事哦? --------------------编程问答-------------------- 对于char*直接可以直接使用stringbuilder,
记得把stringbuilder给个长度,初始化下
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,