<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>