日期:2014-05-17  浏览次数:20874 次

C#如何替换特殊字符'\0'
小弟从网上抄袭了一个加密解密程序要用,结果加密前的字符串s1和解密后的字符串s2竟然不相等。我把2个字符串转换成了字符数组一个一个的比较,发现s1的数组与s2数组相差3个字符。我拉到字符数组的最后才发现原来s1的字符数组后面多了三个'\0',所以C#判定两个字符串不相等。求个方法能在未知后面有多少个'\0'的情况下除掉这个字符!(Replace这招我用过了,不顶用)
c#

------解决方案--------------------
到底是s1后面是\0还是s2后面是\0啊,
你一开始说是s1,看你代码,似乎是对s2处理\0
------解决方案--------------------
保险起见,你s1和s2都处理吧

 char[] ch1 = s1.TrimEnd('\0').ToCharArray();            
 char[] ch2 = s2.TrimEnd('\0').ToCharArray();
------解决方案--------------------
首先要纠正下你的代码,的确是是s1比s2多出几个\0,而不是s2比s1多,并且不一定是3个,其产生的原因是解密部分的函数有错误。
AESDecrypt部分代码纠正如下:
int count = cs.Read(decryptBytes, 0, decryptBytes.Length);
cs.Close();
ms.Close();
string s = Encoding.UTF8.GetString(decryptBytes, 0, count);

但是这样写有个安全隐患,如果你的decryptBytes数组长度小于解密出来的字符串字节长度呢?你怎么知道要初始化的数组长度是多少?
因此正确的写法应该是这样:
        public static void AESDecrypt(byte[] cipherText, byte[] Key, byte[] IV)
        {
            SymmetricAlgorithm des = Rijndael.Create();
            des.Key = Key;
            des.IV = IV;

            MemoryStream stream = new MemoryStream();
            CryptoStream stream2 = new CryptoStream(stream, des.CreateDecryptor(), CryptoStreamMode.Write);
            stream2.Write(cipherText, 0, cipherText.Length);
            stream2.FlushFinalBlock();
            string s = Encoding.UTF8.GetString(stream.ToArray());

            File.WriteAllText("D:\\shiyan.txt", s, Encoding.UTF8);
            System.Console.WriteLine("保存成功!");
            bijiao();
        }