2011-10-07 3 views
8

Convert.FromBase64String 에 대한 tryparse가 있습니까? 아니면 64 문자가 맞는지 아닌지 만 계산합니다.Convert.FromBase64String에서 Tryparse와 비슷한 것

암호화 및 암호 해독 클래스를 복사하지만 다음 줄에 오류가 있습니다. 나는 cipherText 오류

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

Base64는 64 문자를 의미하지 않습니다. 즉, 각 문자는 0에서 63 사이의 숫자를 나타낼 수 있습니다. 10 진수는 Base10은 문자 0-9, 이진수는 Base2 (0 또는 1 허용), 16 진수는 Base16 (0-9와 A-F는 0에서 15 사이의 값을 나타냅니다) –

+0

더 설명 할 수 있습니까? To & FromBase64String이 있으며 문자열을 64 기본 문자 집합을 가진 다른 문자열로 간단히 변환합니다. 정말 구문 분석이 아니에요 ... 그냥 주위에 잡으려고합니까? – bryanmac

+0

그럼 입력 문자열이 올바른 FromBase64String 형식인지 확인하고 Convert.FromBase64String을 사용할 때 오류가 발생하지 않습니다. –

답변

13

잘하지 않고 변환 할 수 있는지 여부를 확인하려면, 먼저 문자열을 확인할 수 있습니다. 올바른 문자 수를 가지고 있어야하고, (str.Length * 6) % 8 == 0으로 확인해야합니다. 그리고 모든 문자를 검사 할 수 있습니다. 그것은 AZ, az, 0-9, +,/그리고 = . = 문자는 끝에 만 나타날 수 있습니다.

이것은 값이 비싸지 만 예외를 잡는 것이 실제로 저렴합니다. 이유는 .NET에는 TryXxx() 버전이 없습니다.

+2

일부 base64 버전은'='스퓨리어스를 갖고 있지 않습니까? 예외를 잡는 또 다른 이유. –

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); 
} 
관련 문제