使用System.Text.UnicodeEncoding.Unicode.GetString(byte [])时,间歇性地反向编码到字节数组失败

时间:2010-08-22 22:38:36

标签: .net unicode encoding cryptography

有人能告诉我为什么以下代码会间歇性地抛出异常吗? 我正在运行Vista Ultimate 32位和VS2010 .NET4

       byte[] saltBytes = new byte[32];

        RNGCryptoServiceProvider.Create().GetBytes(saltBytes);

        string salt = System.Text.UnicodeEncoding.Unicode.GetString(saltBytes);

        byte[] saltBytes2 = System.Text.UnicodeEncoding.Unicode.GetBytes(salt);

        int i = 0;
        foreach(byte b in saltBytes)
        {
            if (saltBytes[i] != saltBytes2[i])
            {
                throw new Exception();
            }

            i++;
        }

2 个答案:

答案 0 :(得分:5)

这可能正在发生,因为随机字节的任意序列不一定可以转换为合法的unicode字符串。

当您的随机字节 可转换为合法的unicode时,您的编码/解码将正常工作;当他们无法兑换时,你会遇到问题。

如果您需要随机字节序列的字符串表示,那么您应该使用Base-64编码:

string salt = Convert.ToBase64String(saltBytes);

byte[] saltBytes2 = Convert.FromBase64String(salt);

答案 1 :(得分:2)

您不能使用随机字节来创建unicode字符串。某些字节序列在该方法假定的编码中是非法的。你为什么要把随机字节变成字符串?