2011-10-07 8 views
8

C'è tryparse per Convert.FromBase64String o contiamo semplicemente il carattere se è uguale a 64 caratteri o meno.Qualcosa come Tryparse da Convert.FromBase64String

Copio una classe di crittografia e decrittografia, ma c'è un errore nella riga seguente. Voglio controllare se il cipherText può essere convertito senza errori

byte[] bytes = Convert.FromBase64String(cipherText); 
+3

Base64 non significa 64 caratteri. Significa che ogni carattere può rappresentare un numero compreso tra 0 e 63. ad es. Decimale è Base10 consente i caratteri 0-9, Binario è Base2 (consente 0 o 1) e Hex è Base16 (consente 0-9 e A-F per rappresentare valori compresi tra 0 e 15) –

+0

Puoi spiegare ulteriormente? C'è To & FromBase64String e converte semplicemente la stringa in un'altra stringa con un set di caratteri di 64 basi. Non è davvero un'analisi ... Vuoi solo provare a catturare intorno ad esso? – bryanmac

+0

Quindi, cosa utilizzo per verificare se la stringa di input è in un formato FromBase64String corretto e non commettere errori quando utilizzo Convert.FromBase64String –

risposta

13

Beh, si potrebbe verificare la stringa di prima. Deve avere il giusto numero di caratteri, verificare con (str.Length * 6)% 8 == 0. E puoi controllare ogni carattere, deve essere nel set AZ, az, 0-9, +,/e = . Il carattere = può apparire solo alla fine.

Questo è costoso, in realtà è più economico solo per cogliere l'eccezione. La ragione per cui .NET non ha una versione TryXxx().

+2

Non alcune versioni di base64 hanno spurious trailing '='? Ancora un altro motivo per cogliere l'eccezione. –

3
public static class Base64Helper 
{ 
    public static byte[] TryParse(string s) 
    { 
     if (s == null) throw new ArgumentNullException("s"); 

     if ((s.Length % 4 == 0) && _rx.IsMatch(s)) 
     { 
      try 
      { 
       return Convert.FromBase64String(s); 
      } 
      catch (FormatException) 
      { 
       // ignore 
      } 
     } 
     return null; 
    } 

    private static readonly Regex _rx = new Regex(
     @"^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=|[A-Za-z0-9+/][AQgw]==)?$", 
     RegexOptions.Compiled); 
}