Gibt es in C # eine andere Möglichkeit, festzustellen, ob eine Zeichenfolge Base 64-codiert ist, als nur zu versuchen, sie zu konvertieren, und festzustellen, ob ein Fehler vorliegt? Ich habe folgenden Codecode:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
Ich möchte die Ausnahme "Ungültiges Zeichen in einer Base-64-Zeichenfolge" vermeiden, die auftritt, wenn der Wert keine gültige Base-64-Zeichenfolge ist. Ich möchte nur false überprüfen und zurückgeben, anstatt eine Ausnahme zu behandeln, da ich davon ausgehe, dass dieser Wert manchmal keine Basis-64-Zeichenfolge ist. Gibt es eine Möglichkeit, dies zu überprüfen, bevor Sie die Convert.FromBase64String-Funktion verwenden?
Vielen Dank!
Update:
Danke für all deine Antworten. Hier ist eine Erweiterungsmethode, die Sie alle verwenden können. Sie scheint sicherzustellen, dass Ihre Zeichenfolge ausnahmslos Convert.FromBase64String besteht. .NET scheint beim Konvertieren in Basis 64 alle nachgestellten und endenden Leerzeichen zu ignorieren, sodass "1234" und "1234" gültig sind.
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);
}
Für diejenigen, die sich über die Leistung des Testens im Vergleich zu Fang und Ausnahme wundern, ist es in den meisten Fällen für diese Basis-64-Sache schneller zu überprüfen, als die Ausnahme zu fangen, bis Sie eine bestimmte Länge erreicht haben. Je kleiner die Länge, desto schneller
In meinen sehr unwissenschaftlichen Tests: Bei 10000 Iterationen für die Zeichenlänge 100.000 - 110000 war es 2,7-mal schneller, zuerst zu testen.
Bei 1000 Iterationen für Zeichen mit einer Länge von 1 bis 16 Zeichen für insgesamt 16.000 Tests war es 10,9-mal schneller.
Ich bin sicher, dass es einen Punkt gibt, an dem es besser wird, mit der ausnahmebasierten Methode zu testen. Ich weiß nur nicht, an welchem Punkt das ist.
\n\fLE16
- Ihre Methode würde hierfür ein falsches Positiv ergeben. Für alle, die eine narrensichere Methode lesen und suchen; Ich würde empfehlen, die FormatException abzufangen oder eine für die Spezifikation geeignete RegEx zu verwenden, siehe stackoverflow.com/questions/475074/… .
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
Zeichen. Wenn das Auffüllen falsch ist, wird ein Fehler ausgegeben, obwohl die Eingabe mit einem Ausdruck übereinstimmt.