C'è un modo in C # per vedere se una stringa è codificata in Base 64 oltre al solo tentativo di convertirla e vedere se c'è un errore? Ho un codice come questo:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
Voglio evitare l'eccezione "Carattere non valido in una stringa Base 64" che si verifica se il valore non è una stringa base 64 valida. Voglio solo controllare e restituire false invece di gestire un'eccezione perché mi aspetto che a volte questo valore non sarà una stringa di base 64. C'è un modo per controllare prima di utilizzare la funzione Convert.FromBase64String?
Grazie!
Aggiornamento:
grazie per tutte le tue risposte. Ecco un metodo di estensione che puoi utilizzare tutti finora sembra assicurarti che la tua stringa passi Convert.FromBase64String senza eccezioni. .NET sembra ignorare tutti gli spazi finali e finali durante la conversione in base 64, quindi "1234" è valido e lo è anche "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);
}
Per coloro che si interrogano sulle prestazioni di test, cattura ed eccezione, nella maggior parte dei casi per questa cosa in base 64 è più veloce controllare che catturare l'eccezione fino a raggiungere una certa lunghezza. Più piccola è la lunghezza più veloce è
Nei miei test molto poco scientifici: per 10000 iterazioni per la lunghezza dei caratteri 100.000 - 110000 è stato 2,7 volte più veloce testare prima.
Per 1000 iterazioni per caratteri di lunghezza compresa tra 1 e 16 caratteri per un totale di 16.000 test, era 10,9 volte più veloce.
Sono sicuro che c'è un punto in cui diventa meglio testare con il metodo basato sulle eccezioni. Non so a che punto sia.
\n\fLE16
: il tuo metodo produrrebbe un falso positivo per questo. Per chi legge e cerca un metodo infallibile; Consiglierei di catturare FormatException o di utilizzare una RegEx adatta alle specifiche, vedere stackoverflow.com/questions/475074/… .
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
segno. Se la spaziatura interna è errata, verrà visualizzato un errore anche se l'input corrisponde a un'espressione.