2010-08-22 4 views
2

Quelqu'un peut-il me dire pourquoi le code suivant lève une exception par intermittence? Je courais Vista Ultimate 32 bits et VS2010 .NET4lors de l'utilisation de System.Text.UnicodeEncoding.Unicode.GetString (byte []) l'encodage inverse au tableau d'octets échoue par intermittence

 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++; 
     } 

Répondre

5

Cela se produit probablement car une séquence arbitraire d'octets aléatoires n'est pas nécessairement convertible en une chaîne unicode légale. Lorsque vos octets aléatoires sont convertibles en unicode légal alors votre encodage/décodage fonctionnera sans erreur; quand ils ne sont pas convertibles, vous aurez des problèmes.

Si vous avez besoin d'une représentation de chaîne d'une séquence aléatoire d'octets, alors vous devriez probablement utiliser le codage Base-64:

string salt = Convert.ToBase64String(saltBytes); 

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

Vous ne pouvez pas utiliser des octets aléatoires pour créer une chaîne de caractères Unicode. Certaines séquences d'octets sont illégales dans l'encodage supposé par cette méthode. Pourquoi essayez-vous de faire des octets aléatoires dans une chaîne?

+0

Je ne savais pas que certaines séquences d'octets sont illégales. J'utilisais le codage unicode pour convertir les octets de sel en une chaîne dans mon propre composant de hachage de mot de passe. Je vais utiliser l'encodage base64 à la place. Merci –

Questions connexes