2010-07-28 30 views
16

Tôi đã tìm cách để xác nhận chuỗi base64 và bắt gặp điều này.Chuỗi xác thực là định dạng base64 sử dụng RegEx?

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$ 

Tôi cần một chút trợ giúp để cho phép "==" cũng như "=".

Cảm ơn

+0

Ý của bạn là gì? '==' và '=' đã được cho phép. – kennytm

+0

Có quyền của bạn hoạt động. Xin lỗi, tôi chỉ cần thêm một chuỗi "=" vào chuỗi được mã hóa của mình để kiểm tra khi tôi cần tạo một chuỗi mã hóa mới có chứa "==" :) – arbme

+0

lưu ý rằng dấu cộng cần phải được thoát. như thế này: '^ (?: [A-Za-z0-9 \ + /] {4}) * (?: [A-Za-z0-9 \ + /] {2} == | [A-Za -z0-9 \ + /] {3} =)? $ ' –

Trả lời

21

Điều này sẽ hoạt động rất tốt.

private static readonly HashSet<char> _base64Characters = new HashSet<char>() { 
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 
    '=' 
}; 

public static bool IsBase64String(string value) 
{ 
    if (string.IsNullOrEmpty(value)) 
    { 
     return false; 
    } 
    else if (value.Any(c => !_base64Characters.Contains(c))) 
    { 
     return false; 
    } 

    try 
    { 
     Convert.FromBase64String(value); 
     return true; 
    } 
    catch (FormatException) 
    { 
     return false; 
    } 
} 
+0

+1 Đối với giải pháp đơn giản nhất. –

+0

Tôi muốn sự rõ ràng của phiên bản này trừ khi bạn mong đợi rất nhiều dữ liệu không hợp lệ. – Justin

+0

Cũng có thể sử dụng Base64 để kiểm tra thay vì sau đó RegEx ... có ý nghĩa;) – arbme

8

Tôi đã cập nhật mã trên một chút để đáp ứng vài yêu cầu hơn:

  • séc cho kích thước chuỗi đúng (nên là bội số của 4)
  • séc cho số ký tự pad (nên tối đa 2 ký tự ở cuối chuỗi chỉ)
  • làm cho nó hoạt động trong .NET 2.0 (tốt, HashSet<T> nên được triển khai hoặc sử dụng Dictionary<T, U>)

Mã này là một phần của thư viện khẳng định của tôi, vì vậy đây là lý do tại sao có hai phương pháp kiểm tra và param tham số ...

private const char Base64Padding = '='; 

    private static readonly HashSet<char> Base64Characters = new HashSet<char>() 
    { 
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 
     'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 
     'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
     'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' 
    }; 

    public static void CheckBase64String(string param, string paramName) 
    { 
     if (CheckBase64StringSafe(param) == false) 
     { 
      throw (new ArgumentException(String.Format("Parameter '{0}' is not a valid Base64 string.", paramName))); 
     } 
    } 

    public static bool CheckBase64StringSafe(string param) 
    { 
     if (param == null) 
     { 
      // null string is not Base64 something 
      return false; 
     } 

     // replace optional CR and LF characters 
     param = param.Replace("\r", String.Empty).Replace("\n", String.Empty); 

     if (param.Length == 0 || 
      (param.Length % 4) != 0) 
     { 
      // Base64 string should not be empty 
      // Base64 string length should be multiple of 4 
      return false; 
     } 

     // replace pad chacters 
     int lengthNoPadding = param.Length; 
     int lengthPadding; 

     param = param.TrimEnd(Base64Padding); 
     lengthPadding = param.Length; 

     if ((lengthNoPadding - lengthPadding) > 2) 
     { 
      // there should be no more than 2 pad characters 
      return false; 
     } 

     foreach (char c in param) 
     { 
      if (Base64Characters.Contains(c) == false) 
      { 
       // string contains non-Base64 character 
       return false; 
      } 
     } 

     // nothing invalid found 
     return true; 
    } 

tôi đã không kiểm tra mã rộng rãi, vì vậy không có chức năng đảm bảo nào cả!

Các vấn đề liên quan