при использовании System.Text.UnicodeEncoding.Unicode.GetString (byte []) обратное кодирование в массив байтов периодически прерывается - PullRequest
2 голосов
/ 23 августа 2010

Может кто-нибудь сказать мне, почему следующий код периодически вызывает исключение?Я использую 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 ]

5 голосов
/ 23 августа 2010

Вероятно, это происходит потому, что произвольная последовательность случайных байтов не обязательно может быть преобразована в допустимую строку Юникода.

Когда ваши случайные байты конвертируются в допустимый юникод, тогда ваше кодирование / декодирование будет работать без ошибок; когда они не конвертируемы, у вас будут проблемы.

Если вам нужно строковое представление случайной последовательности байтов, то вам, вероятно, следует использовать кодировку Base-64:

string salt = Convert.ToBase64String(saltBytes);

byte[] saltBytes2 = Convert.FromBase64String(salt);
2 голосов
/ 23 августа 2010

Вы не можете использовать случайные байты для создания строки Unicode.Определенные последовательности байтов недопустимы в кодировке, принятой этим методом.Почему вы пытаетесь превратить случайные байты в строку?

...