Existe-t-il un moyen en C # de voir si une chaîne est encodée en Base 64 autre que d'essayer de la convertir et de voir s'il y a une erreur? J'ai un code de code comme celui-ci:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
Je veux éviter l'exception «Caractère invalide dans une chaîne de base 64» qui se produit si la valeur n'est pas une chaîne de base 64 valide. Je veux simplement vérifier et renvoyer false au lieu de gérer une exception car je m'attends à ce que parfois cette valeur ne soit pas une chaîne de base 64. Existe-t-il un moyen de vérifier avant d'utiliser la fonction Convert.FromBase64String?
Merci!
Mise à jour:
Merci pour toutes vos réponses. Voici une méthode d'extension que vous pouvez tous utiliser jusqu'à présent, elle semble garantir que votre chaîne passera Convert.FromBase64String sans exception. .NET semble ignorer tous les espaces de fin et de fin lors de la conversion en base 64, donc "1234" est valide, tout comme "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);
}
Pour ceux qui s'interrogent sur les performances des tests par rapport à la capture et à l'exception, dans la plupart des cas, pour cette chose de base 64, il est plus rapide de vérifier que d'attraper l'exception jusqu'à ce que vous atteigniez une certaine longueur. Plus la longueur est petite, plus vite c'est
Dans mes tests très peu scientifiques: pour 10000 itérations pour une longueur de caractères de 100 000 à 110000, il était 2,7 fois plus rapide de tester en premier.
Pour 1000 itérations pour des caractères de 1 à 16 caractères pour un total de 16 000 tests, c'était 10,9 fois plus rapide.
Je suis sûr qu'il y a un moment où il devient préférable de tester avec la méthode basée sur les exceptions. Je ne sais tout simplement pas à quel point c'est.
\n\fLE16
- votre méthode donnerait un faux positif pour cela. Pour tous ceux qui lisent et recherchent une méthode infaillible; Je recommanderais d'attraper l'exception FormatException ou d'utiliser un RegEx adapté aux spécifications, voir stackoverflow.com/questions/475074/… .
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
signe. Si le remplissage est incorrect, cela donnera une erreur même si l'entrée correspond à une expression.