Existe uma maneira no C # para ver se uma string está codificada na Base 64, além de apenas tentar convertê-la e ver se há algum erro? Eu tenho código de código como este:
// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);
Desejo evitar a exceção "Caractere inválido em uma seqüência de caracteres Base-64" que ocorre se o valor não for uma string base 64 válida. Quero apenas verificar e retornar false em vez de manipular uma exceção, porque espero que, às vezes, esse valor não seja uma cadeia de base 64. Existe alguma maneira de verificar antes de usar a função Convert.FromBase64String?
Obrigado!
Atualização:
Obrigado por todas as suas respostas. Aqui está um método de extensão que você pode usar até agora, para garantir que sua string seja aprovada em Convert.FromBase64String sem uma exceção. O .NET parece ignorar todos os espaços finais e finais ao converter para a base 64, para que "1234" seja válido e "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);
}
Para aqueles que se perguntam sobre o desempenho dos testes versus captura e exceção, na maioria dos casos, para essa coisa de base 64, é mais rápido verificar do que capturar a exceção até atingir um determinado comprimento. Quanto menor o comprimento, mais rápido é
Em meus testes muito pouco científicos: para 10000 iterações para caracteres de 100.000 a 110000, era 2,7 vezes mais rápido testar primeiro.
Para 1000 iterações para caracteres de 1 a 16 caracteres para um total de 16.000 testes, foi 10,9 vezes mais rápido.
Estou certo de que há um ponto em que se torna melhor testar com o método baseado em exceção. Só não sei em que ponto.
\n\fLE16
- seu método produziria um falso positivo para isso. Para quem lê e procura um método infalível; Eu recomendaria capturar o FormatException ou usar um RegEx adequado às especificações, consulte stackoverflow.com/questions/475074/… .
@"^[a-zA-Z0-9\+/]*={0,2}$"
=
sinal. Se o preenchimento estiver errado, ocorrerá um erro, mesmo que a entrada corresponda a uma expressão.