Czy istnieje sposób w C #, aby sprawdzić, czy ciąg jest zakodowany w Base 64, inny niż tylko próba przekonwertowania go i sprawdzenie, czy wystąpił błąd? Mam taki kod:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
Chcę uniknąć wyjątku „Nieprawidłowy znak w ciągu Base-64”, który ma miejsce, jeśli wartość nie jest prawidłowym ciągiem bazowym 64. Chcę po prostu sprawdzić i zwrócić false zamiast obsługiwać wyjątek, ponieważ oczekuję, że czasami ta wartość nie będzie ciągiem bazowym 64. Czy istnieje sposób na sprawdzenie przed użyciem funkcji Convert.FromBase64String?
Dzięki!
Aktualizacja:
Dziękuję za wszystkie odpowiedzi. Oto metoda rozszerzenia, z której wszyscy do tej pory korzystali, wydaje się, że zapewnia ona, że łańcuch przejdzie Convert.FromBase64String bez wyjątku. NET wydaje się ignorować wszystkie końcowe i końcowe spacje podczas konwersji do bazy 64, więc „1234” jest poprawne, podobnie jak „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);
}
Dla tych, którzy zastanawiają się nad wydajnością testowania w porównaniu z przechwytywaniem i wyjątkami, w większości przypadków dla tej podstawowej 64 rzeczy szybsze jest sprawdzenie niż złapanie wyjątku, dopóki nie osiągniesz określonej długości. Im mniejsza długość, tym szybciej
W moich bardzo nienaukowych testach: dla 10000 iteracji dla długości znaków 100 000 - 110000 testowanie w pierwszej kolejności było 2,7 razy szybsze.
Dla 1000 iteracji dla znaków o długości od 1 do 16 znaków w sumie dla 16 000 testów było 10,9 razy szybciej.
Jestem pewien, że jest moment, w którym lepiej jest testować przy użyciu metody opartej na wyjątkach. Po prostu nie wiem, w którym momencie to jest.
\n\fLE16
- Twoja metoda przyniosłaby fałszywie dodatni wynik. Dla każdego, kto czyta i szuka niezawodnej metody; Poleciłbym złapanie FormatException lub użycie RegEx dopasowanego do specyfikacji, zobacz stackoverflow.com/questions/475074/… .
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
znaku. Jeśli wypełnienie jest nieprawidłowe, spowoduje to błąd, nawet jeśli dane wejściowe są zgodne z wyrażeniem.