2011-10-07 13 views
8

¿Hay algún tryparse para Convert.FromBase64String o simplemente contamos el carácter si es igual a 64 caracteres o no?Algo así como Tryparse de Convert.FromBase64String

Copio una clase de cifrado y descifrado, pero hay un error en la siguiente línea. Quiero comprobar si el cipherText se puede convertir sin error

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

Base64 no significa 64 caracteres. Significa que cada personaje puede representar un número entre 0 y 63. p. El decimal es Base10 permite los caracteres 0-9, Binary es Base2 (permite 0 o 1) y Hex es Base16 (permite que 0-9 y A-F representen valores entre 0 y 15) –

+0

¿Puede seguir explicando? Hay To & FromBase64String y simplemente convierte la cadena en otra cadena con un conjunto de 64 caracteres base. En realidad no es un análisis ... ¿Solo quieres un Try catch alrededor de él? – bryanmac

+0

Entonces, ¿qué debo usar para verificar si la cadena de entrada está en un formato FromBase64String correcto y no cometer un error cuando uso Convert.FromBase64String –

Respuesta

13

Bueno, se puede comprobar la cuerda primero. Debe tener el número correcto de caracteres, verificar con (str.Length * 6)% 8 == 0. Y puede verificar cada carácter, debe estar en el conjunto AZ, az, 0-9, +,/y = . El carácter = solo puede aparecer al final.

Esto es costoso, en realidad es más económico detectar la excepción. La razón .NET no tiene una versión TryXxx().

+2

¿Algunas versiones de base64 no tienen un seguimiento falso '='? Otra razón más para atrapar la excepción. –

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); 
} 
Cuestiones relacionadas