分别用C#和C++写了两个MD5加密方法,在C#中调用了C++的dll.
c++
extern "C" __declspec(dllexport) char * MDString (char tmp[128])
{
unsigned char digest[16];
MD5_CTX context;
 
/*scanf("%s",tmp);*/
int result ;
char *cString=new char; MD5Init (&context);
int len=strlen(tmp);
MD5Update (&context, (unsigned char*)tmp, len);
MD5Final (digest,&context); char * msg = new char;
/*printf("MD5Value:");*/
for(int i=0; i<16; ++i)
{
sprintf(msg,"%02X",digest[i]);
return_char[i*2]  = msg[0];
return_char[i*2+1] =msg[1];
}
//sprintf(cString, "%d", result);
return return_char;
}
C#代码
 [DllImport("pathjiami.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static string MDString(string tmp);        public Form1()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            string str = txt.Text;
            //<<<<< 2013-03-20 
            //string txtStr = "";
            ////int len = str.Length;
            //Encoding code = Encoding.GetEncoding("unicode");
            //byte[] arr = code.GetBytes(str);
            //foreach (byte ch in arr)
            //    txtStr += Convert.ToString(ch, 16);
            //>>>>>
            string msg = MDString(str);
            //接收C++md5加密结果.
            txt2.Text = msg;            //接收C#md5加密结果.
            txt3.Text = StringToMD5Hash(str);
        }        public string StringToMD5Hash(string inputString)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] encryptedBytes = md5.ComputeHash(Encoding.ASCII.GetBytes(inputString);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < encryptedBytes.Length; i++)
            {
                sb.AppendFormat("{0:x2}", encryptedBytes[i]);
            }
            return sb.ToString();
        }    两种方法在文本框输入不含中文时获得的加密结果才是一样的,现在我想让它输入时含中文获得的加密结果也一样,可是小的实在不懂C++。只能想办法把C#方法的字符类型或者编码方式转化成C++,可是再可是...怎么弄,求大神们给解决办法..

解决方案 »

  1.   

    导入的时候加上  CharSet=CharSet.Ansi
      

  2.   

    只加CharSet=CharSet.Ansi应该还不够吧,是不是C#的方法里类型也要变什么的..为什么没有人
      

  3.   

    试试不要用 ASCII 编码,试试 Unicode
      

  4.   

    建议你用C#的MD5。
    示例中的MDString函数漏洞很多,不要用它。
      

  5.   

    没有学习过C++,MDString 还是很长去年自己参照别人的代码写的,现在一看都不知道哪哪了...我只是想输入中文他们结果也相同,,,,,办法...........
      

  6.   

    已经解决了,谢谢各位的帮助。
    哎,困扰了我大半天的东西原来只是一个小地方.....
    Encoding.ASCII.GetBytes(inputString) 改为Encoding.Default.GetBytes(inputString)
     public string StringToMD5Hash(string inputString)
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                byte[] encryptedBytes = md5.ComputeHash(Encoding.ASCII.GetBytes(inputString));
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < encryptedBytes.Length; i++)
                {
                    sb.AppendFormat("{0:x2}", encryptedBytes[i]);
                }
                return sb.ToString();
            }