<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>Dont use CharSet.Ansi. Try CharSet.Unicode.<br><br>Sent from a computer</div><div><br>On Mar 11, 2014, at 7:55 AM, "Wang Jiteng" <<a href="mailto:imwjt@163.com">imwjt@163.com</a>> wrote:<br><br></div><blockquote type="cite"><div><div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial">Nowadays I'm working on a project in which I need to call encryption and decryption  functions. These functions are written in C and have been compiled into a DLL under windows(visual studio 2010). <br><br>The functions in the DLL(which is called Cypher.dll) are:<br>unsigned long decrypt(unsigned char *reval, const char *in,  unsigned long len )<br><br>and<br>unsigned long encrypt(char *out, const unsigned char *data, unsigned long len)<br><br>In my C# codes, I re-write these two functions with :<br>    [DllImport("Cypher.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl, EntryPoint = "decrypt")]   <br>        public  extern static uint decrypt([Out] ref byte reval,ref byte c,uint len);<br>/*<br>reval:  the decrypted text <br>c: the cypher text to be decrypted.<br>len: text length (the fellow who gave me the dll said this parameter can be 
assigned by any value,so I usually assigned it by c.Length)<br>*/<br>    [DllImport("Cypher.dll", CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl, EntryPoint = "encrypt")]<br>        public  extern static uint encrypt(ref byte ou,ref byte data, uint len);<br>/*<br>out: the encrypted cypher text<br>data:the text to be encrypted, which usually is a path like "C:\\Users\\downtown\\Desktop\\something\\test" or "C:\\Users\\downtown\\Desktop\\测试集\\test" (I)<br>len:
 text length<br>*/<br><br>Compared with calling the Cypher.dll direclty in C codes, the "encrypt" function always works correctly. The "decrypt" function works fine if the input parameter "data" in "encrypt" are standard ASCII charaters. <br>But when I add some CHINESE characters(I'm a Chinese progammer btw. Forgive my poor English :P ) like "C:\\Users\\downtown\\Desktop\\测试集\\test". <br>The "decrypt" result goes wrong, which is "C:\\Users\\downtown\\Desktop\\测试集\\t" (some characters in the end of the string are cut off).<br><br>if I input "C:\\Users\\downtown\\Desktop\\测试\\test", the "decrypt" is "C:\\Users\\downtown\\Desktop\\测试\\te"<br><br>It is interesting because each Chinese character takes two byte (in ANSI or UTF8). But the "decrypt" function seems retain just one byte for each Chinese character.<br>So When 3 Chinese characters(测试集) exists in the string, after decrypted, they "eat" 3 bytes('e','s' and 't') at the of the string.<br>When 2 Chinese characters(测试) exists in the string, after decrypted, they "eat" 2 bytes('s' and 't') at the of the string.<br><br>Dose anybody knows why that happens???<br><br>and the codes to call these fuctions above are:<br>//Encrypt function;<br>      public string EncryptParameters(string args)<br>      {<br>        byte[] plainBytes = System.Text.Encoding.Default.GetBytes(args);<br>        int cypher_maxlen = args.Length*2+16;<br>//prepare the cypher text byte array<br>        byte[] c = new byte[cypher_maxlen];<br>        int i=0;<br><br>        CFunction.encrypt(ref c[0],ref plainBytes[0], (uint)args.Length);<br><br>        for(i=0;c[i]!=0 && i<cypher_maxlen;i++)//;<br>                Console.Write(c[i]+" ");<br><br>        string cypher_str = System.Text.Encoding.Default.GetString(c, 0, i);<br>        return cypher_str;<br>      }<br><br>//Decrypt Function<br>      public string DecryptParameters(string args)<br>      {<br>        int plain_maxlen = args.Length;<br><br>//add a '\0' to the end, or the "decrypt" function goes wrong sometime.<br>        string args_with_end = args + "\0";<br>        byte[] cypherBytes = System.Text.Encoding.Default.GetBytes(args_with_end);<br>        int i=0;<br><br>//prepare the byte array of decrypted text<br>        byte[] p = new byte[plain_maxlen];<br>        CFunction.decrypt(p,cypherBytes,(uint)cypherBytes.Length);<br><br>        for(i=0;p[i]!=0 && i<plain_maxlen;i++);<br>        string plain_str = System.Text.Encoding.Default.GetString(p, 0, i);<br>        return plain_str;<br>      }<br><br>and I call these two functions above like:<br>         string cypher_args = EncryptParaments(init_args);<br>         string plain_args = DecryptParaments(cypher_args);<br>and the string plain_args are not always correct as I mentioned. <br><br>Thanks.<br><div><div><br></div></div></div><br><br><span title="neteasefooter"><span id="netease_mail_footer"></span></span></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Mono-devel-list mailing list</span><br><span><a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a></span><br><span><a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a></span><br></div></blockquote></body></html>