Чи є спосіб в C # перевірити, чи є рядок закодованою Base 64, крім того, щоб просто перетворити її і побачити, чи є помилка? У мене такий код коду:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
Я хочу уникати винятку "Недійсний символ у рядку Base-64", який трапляється, якщо значення не є дійсним базовим 64 рядком. Я хочу просто перевірити і повернути false, а не обробляти виняток, тому що я очікую, що іноді це значення не буде базовим 64 рядком. Чи є спосіб перевірити, перш ніж використовувати функцію Convert.FromBase64String?
Дякую!
Оновлення:
Дякую за всі ваші відповіді. Ось метод розширення, яким ви можете користуватися до цих пір, схоже, переконайтеся, що ваша рядок пройде Convert.FromBase64String без винятку. Здається, що .NET ігнорує всі проміжні та кінцеві пробіли під час переходу на базу 64, тому "1234" є дійсним, а також "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);
}
Для тих, хто цікавиться ефективністю тестування порівняно з ловом та винятком, у більшості випадків для цієї базової 64 перевіряється швидше, ніж виловлювати виняток, поки ви не досягнете певної довжини. Чим менша довжина, тим швидше
У моєму дуже ненауковому тестуванні: для 10000 ітерацій довжиною символу 100 000 - 110000 було тестувати в 2,7 рази швидше.
За 1000 ітерацій символів довжиною 1 - 16 символів для загальної кількості 16000 тестів це було в 10,9 разів швидше.
Я впевнений, що є момент, коли краще перевірити метод, заснований на винятках. Я просто не знаю, в якому моменті це.
\n\fLE16
- ваш метод дасть помилковий позитив для цього. Для всіх, хто читає та шукає бездоганний метод; Я рекомендую вловлювати FormatException або використовувати відповідний RegEx, див. Stackoverflow.com/questions/475074/… .
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
знака. Якщо підкладка помилкова, це призведе до помилки, навіть якщо вхід відповідає виразу.