2011-10-07 13 views
8

Czy jest jakaś próba dla Convert.FromBase64String lub po prostu policzymy znak, jeśli ma on 64 znaków lub nie.Coś jak Tryparse od Convert.FromBase64String

Kopiuję klasę szyfrowania i odszyfrowywania, ale w poniższym wierszu występuje błąd. Chcę sprawdzić, czy cipherText można przekształcić bez błędu

byte[] bytes = Convert.FromBase64String(cipherText); 
+3

Base64 nie oznacza 64 znaków. Oznacza to, że każdy znak może reprezentować liczbę z zakresu od 0 do 63. Decimal is Base10 pozwala na znaki 0-9, Binary to Base2 (pozwala 0 lub 1), a Hex to Base16 (pozwala 0-9 i A-F reprezentować wartości między 0 a 15). –

+0

Czy możesz wyjaśnić dalej? Jest To & FromBase64String i po prostu konwertuje ciąg na inny ciąg z 64-bitowym zestawem znaków. To naprawdę nie jest parse ... Czy chcesz po prostu spróbować złapać wokół niego? – bryanmac

+0

Więc to, czego używam do sprawdzenia, czy wejściowy ciąg znaków jest w poprawnym formacie FromBase64String i nie powodują błędu, kiedy używam Convert.FromBase64String –

Odpowiedz

13

Cóż, można najpierw sprawdzić łańcuch. Musi mieć odpowiednią liczbę znaków, zweryfikować przy pomocy (str.Length * 6)% 8 == 0. I możesz sprawdzić każdy znak, musi on być w zestawie AZ, az, 0-9, +,/i = . Znak = może pojawić się tylko na końcu.

Jest to kosztowne, taniej jest po prostu złapać wyjątek. Przyczyna .NET nie ma wersji TryXxx().

+2

Czy niektóre wersje base64 mają fałszywe końcowe '='? Jeszcze jeden powód, by złapać wyjątek. –

3
public static class Base64Helper 
{ 
    public static byte[] TryParse(string s) 
    { 
     if (s == null) throw new ArgumentNullException("s"); 

     if ((s.Length % 4 == 0) && _rx.IsMatch(s)) 
     { 
      try 
      { 
       return Convert.FromBase64String(s); 
      } 
      catch (FormatException) 
      { 
       // ignore 
      } 
     } 
     return null; 
    } 

    private static readonly Regex _rx = new Regex(
     @"^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=|[A-Za-z0-9+/][AQgw]==)?$", 
     RegexOptions.Compiled); 
} 
Powiązane problemy