¿Hay alguna manera en C # para ver si una cadena está codificada en Base 64, aparte de tratar de convertirla y ver si hay un error? Tengo un código de código como este:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
Quiero evitar la excepción "Carácter inválido en una cadena Base-64" que ocurre si el valor no es una cadena base 64 válida. Solo quiero verificar y devolver falso en lugar de manejar una excepción porque espero que a veces este valor no sea una cadena base 64. ¿Hay alguna forma de verificar antes de usar la función Convert.FromBase64String?
¡Gracias!
Actualización:
Gracias por todas sus respuestas. Aquí hay un método de extensión que todos pueden usar hasta ahora, parece asegurarse de que su cadena pasará Convert.FromBase64String sin una excepción. .NET parece ignorar todos los espacios finales y finales al convertir a base 64, por lo que "1234" es válido y también "1234"
public static bool IsBase64String(this string s)
{
s = s.Trim();
return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
}
Para aquellos que se preguntan sobre el rendimiento de las pruebas frente a la captura y la excepción, en la mayoría de los casos para esta cosa de base 64 es más rápido verificar que detectar la excepción hasta que alcance una cierta longitud. Cuanto menor es la longitud, más rápido es
En mis pruebas muy poco científicas: para 10000 iteraciones para la longitud de caracteres 100,000 - 110000, fue 2,7 veces más rápido probar primero.
Para 1000 iteraciones para caracteres de longitud 1 - 16 caracteres para un total de 16,000 pruebas, fue 10.9 veces más rápido.
Estoy seguro de que hay un punto en el que es mejor probar con el método basado en excepciones. Simplemente no sé en qué punto es eso.
\n\fLE16
: su método arrojaría un falso positivo para esto. Para cualquiera que lea y busque un método infalible; Recomendaría capturar la FormatException o usar un RegEx adecuado a las especificaciones, consulte stackoverflow.com/questions/475074/… .
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
signo. Si el relleno es incorrecto, dará un error aunque la entrada coincida con una expresión.