একটি বৈধ বেস 64 এনকোডড স্ট্রিংয়ের জন্য কীভাবে চেক করবেন


127

সি # তে কোনও উপায় আছে কি দেখার জন্য যে কোনও স্ট্রিং বেস 64 এনকোডযুক্ত তা রূপান্তর করার চেষ্টা করা ছাড়া অন্য কোনও ত্রুটি আছে কিনা তা দেখুন? আমার কাছে কোড কোড রয়েছে:

// Convert base64-encoded hash value into a byte array.
byte[] HashBytes = Convert.FromBase64String(Value);

মানটি বেইজ 64 স্ট্রিং না হলে ঘটে যাওয়া "বেস -64 স্ট্রিংয়ের অবৈধ অক্ষর" ব্যতীত আমি এড়াতে চাই। আমি কেবল একটি ব্যতিক্রম পরিচালনা করার পরিবর্তে মিথ্যা যাচাই বাছাই করতে চাই কারণ আমি আশা করি যে কখনও কখনও এই মানটি একটি বেস 64 স্ট্রিং হয়ে উঠবে না। কনভার্ট.ফর্মব্যাস 64 স্ট্রিং ফাংশনটি ব্যবহার করার আগে কি চেক করার কোনও উপায় আছে?

ধন্যবাদ!

আপডেট:
আপনার সমস্ত উত্তরের জন্য ধন্যবাদ। এখানে আপনি এখন পর্যন্ত সমস্ত ব্যবহার করতে পারেন এমন একটি এক্সটেনশন পদ্ধতি এখানে মনে হচ্ছে আপনার স্ট্রিংটি কনভার্টে চলে যাবে তা নিশ্চিত করে। ফ্রেমব্যাস 64 স্ট্রিং ব্যতিক্রম ছাড়াই। .NET "644 বেসকে রূপান্তর করার সময় সমস্ত ট্রেলিং এবং শেষ স্থানগুলি উপেক্ষা করবে বলে মনে হয় তাই" 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 ক্ষেত্রে বেশিরভাগ ক্ষেত্রে ব্যতিক্রমটি ধরার চেয়ে আপনি যতক্ষণ না নির্দিষ্ট দৈর্ঘ্যে পৌঁছাবেন তত দ্রুত পরীক্ষা করা দ্রুত। দৈর্ঘ্য যত তাড়াতাড়ি তত ছোট

আমার অত্যন্ত অবৈজ্ঞানিক পরীক্ষায়: চরিত্রের দৈর্ঘ্য 100,000 - 110000 এর জন্য 10000 পুনরাবৃত্তির জন্য এটি প্রথম পরীক্ষা করা 2.7 গুণ বেশি দ্রুত ছিল।

অক্ষরের দৈর্ঘ্যের জন্য 1000 পুনরাবৃত্তির জন্য 1 - 16 টি মোট 16,000 পরীক্ষার জন্য অক্ষর এটি 10.9 গুণ বেশি দ্রুত ছিল।

আমি নিশ্চিত যে এমন একটি পয়েন্ট রয়েছে যেখানে ব্যতিক্রম ভিত্তিক পদ্ধতিতে পরীক্ষা করা আরও ভাল হয়ে যায়। আমি ঠিক জানি না কোন মুহূর্তে।


1
আপনি চেকটি কতটা "সম্পূর্ণ" চান তা নির্ভর করে। অন্যরা যেমন উত্তর দিয়েছে তেমন আপনি রেজেক্স ব্যবহার করে কিছু প্রাক-বৈধতা ব্যবহার করতে পারেন তবে এটি কেবলমাত্র সূচক নয়। বেস 64 এনকোডিং =সাইন ব্যবহার করে কিছু ক্ষেত্রে প্যাডিং প্রয়োজন । প্যাডিংটি ভুল হলে, ইনপুটটি একটি অভিব্যক্তির সাথে মিল থাকলেও এটি একটি ত্রুটি দেয়।
vcsjones

1
আপনার অবস্থা একচেটিয়াভাবে বেস 64 স্ট্রিং সন্তুষ্ট করে না। স্ট্রিংটি বিবেচনা করুন \n\fLE16- আপনার পদ্ধতি এটির জন্য একটি মিথ্যা ইতিবাচক ফল দেবে। যে কারও জন্য পড়া এবং একটি নির্বোধ পদ্ধতি অনুসন্ধান; আমি FormatException সংক্রামক বা ব্যবহার করে একটি বৈশিষ্ট-উপযুক্ত Regex দেখুন সুপারিশ করবে stackoverflow.com/questions/475074/...
এলোমেলো

যদি উপরের পদ্ধতিটি মিথ্যা ফেরত দেয় তবে আমি স্ট্রিংটিকে সঠিক দৈর্ঘ্যে কীভাবে প্যাড করতে পারি?
পল আলেকজান্ডার

3
আমি বিশ্বাস করি যে রেজিএক্স হওয়া উচিত@"^[a-zA-Z0-9\+/]*={0,2}$"
আজতার

এই সমাধান নির্ভরযোগ্য নয়। আপনি 4 টি একই অক্ষরের স্ট্রিং যুক্ত করলে এটি ব্যর্থ হয়।
বেটিমস

উত্তর:


49

বেস 64৪ স্ট্রিংটি সনাক্ত করা খুব সহজ, কারণ এটি কেবল অক্ষর দ্বারা গঠিত 'A'..'Z', 'a'..'z', '0'..'9', '+', '/'হবে এবং দৈর্ঘ্যটিকে ৪ এর একাধিক করে তুলতে প্রায় শেষে '=' দিয়ে প্যাড করা হয় তবে এগুলির তুলনা না করে আপনি ' d ব্যতিক্রমটি উপেক্ষা করা ভাল, যদি এটি ঘটে থাকে।


1
আমি মনে করি আপনি সঠিক পথে আছেন আমি কিছু পরীক্ষা করেছি এবং দেখে মনে হচ্ছে এটি 3 এর পরিবর্তে 4 এর গুণক
ক্রিস মুলিনস

1
এনকোডিংয়ের সময়, সফল এনকোডিংয়ের জন্য এর দৈর্ঘ্যটি 3 এর একাধিক হওয়া দরকার! এর জন্য দুঃখিত ... এবং হ্যাঁ, আপনি ঠিক বলেছেন ... এনকোডযুক্ত স্ট্রিংটির দৈর্ঘ্য রয়েছে যা 4 এর একাধিক হয় Tha তবে কেন আমরা 3 '=' পর্যন্ত প্যাড করব।
অনিরুদ রমনাথন

4
সঠিক হিসাবে চিহ্নিত হয়েছে কারণ আপনি প্রথমে একাধিক জিনিস উল্লেখ করেছেন। সমাধানটি বাস্তবায়নের সাথে আমি আমার প্রশ্ন আপডেট করেছি আপনি যদি এতে কোন সমস্যা দেখেন তবে আমাকে জানান know
ক্রিস মুলিনস

47

সি # 7.2 থেকে রূপান্তর করুন ট্রাইফ্র্যামব্যাস 64 স্ট্রিং ব্যবহার করুন

public static bool IsBase64String(string base64)
{
   Span<byte> buffer = new Span<byte>(new byte[base64.Length]);
   return Convert.TryFromBase64String(base64, buffer , out int bytesParsed);
}

1
আমি জানি না যে এটি একটি জিনিস ছিল। আমি মনে করি
ক্রিস মুলিনস

4
কেবল নেট নেট 2.1+ বা। নেট স্ট্যান্ডার্ড 2.1+ এ কাজ করে
সাইরাস

সি # হ'ল একটি সংকলক এবং ট্রাইফ্র্যামব্যাস 64 স্ট্রিং। নেট ফ্রেমওয়ার্কের এপিআই :)
ব্যবহারকারীর 60967

এই অ-প্যাডেড স্ট্রিং জন্য মিথ্যা ফিরে আসবে, এখানে একটি ফিক্স হল: Convert.TryFromBase64String(base64.PadRight(base64.Length / 4 * 4 + (base64.Length % 4 == 0 ? 0 : 4), '='), new Span<byte>(new byte[base64.Length]), out _)। ধন্যবাদ.
rvnlord

44

আমি জানি আপনি বলেছেন যে আপনি একটি ব্যতিক্রম ধরতে চান না। তবে, কারণ একটি ব্যতিক্রম ধরা আরও নির্ভরযোগ্য, তাই আমি এগিয়ে গিয়ে এই উত্তরটি পোস্ট করব post

public static bool IsBase64(this string base64String) {
     // Credit: oybek https://stackoverflow.com/users/794764/oybek
     if (string.IsNullOrEmpty(base64String) || base64String.Length % 4 != 0
        || base64String.Contains(" ") || base64String.Contains("\t") || base64String.Contains("\r") || base64String.Contains("\n"))
        return false;

     try{
         Convert.FromBase64String(base64String);
         return true;
     }
     catch(Exception exception){
     // Handle the exception
     }
     return false;
}

আপডেট: আমি নির্ভরযোগ্যতা আরও উন্নত করতে ওবাইককে ধন্যবাদ শর্তটি আপডেট করেছি ।


1
base64String.Containsএকাধিকবার কল করার ফলে base64Stringবড় স্ট্রিং না হয়ে খারাপ পারফরম্যান্স হতে পারে ।
NucS

@ নিউস আপনি ঠিক বলেছেন, আমরা এখানে একটি সংকলিত রেজেক্স ব্যবহার করতে পারি।
হার্সিমরানব

1
তোমার জন্য পরীক্ষা করতে পারবেন base64String== null || base64String.Length == 0সঙ্গেstring.IsNullOrEmpty(base64String)
ড্যানিয়েল Tulp

নোট করুন যে একটি বেস 64 ইস্যু ছাড়াই হোয়াইটস্পেস (যেমন লাইন ব্রেক) ধারণ করতে পারে can তারা পার্সার দ্বারা উপেক্ষা করা হয়।
টিমোথি

2
যেহেতু আমাদের কাছে .NET উত্স কোড অ্যাক্সেস রয়েছে এখন আমরা ফিয়ারব্যাস 64 স্ট্রিং () ফাংশনটি এই সমস্ত চেক করে দেখতে পাচ্ছি। রেফারেন্সসোর্স.মাইক্রোসফট.কম /# mscorlib/system/… এটি যদি একটি বৈধ বেস 64 স্ট্রিং হয় তবে আপনি এটি দুটিবার পরীক্ষা করে দেখছেন। ব্যতিক্রমটি কেবল চেষ্টা / ধরা চেষ্টা করা যায়।
iheartchaharp

16

আমি বিশ্বাস করি রেজেক্স হওয়া উচিত:

    Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,2}$")

কেবল এক বা দুটি পেছনের '=' চিহ্নের সাথে মিলছে, তিনটি নয়।

sস্ট্রিংটি যাচাই করা উচিত। নেমস্পেসের Regexঅংশ System.Text.RegularExpressions


1
স্ট্রিংয়ের দৈর্ঘ্য 4 = 0
-র মডেল

7

কেন কেবল ব্যতিক্রম ধরা না, এবং মিথ্যা প্রত্যাবর্তন?

এটি সাধারণ ক্ষেত্রে অতিরিক্ত ওভারহেড এড়ানো হয়।


1
এটি এমন একটি অস্বাভাবিক ঘটনা যেখানে আমি অনুমান করি যেখানে আমি মানটি ব্যবহার করতে যাচ্ছি বেস বেস না হওয়ার সম্ভাবনা বেশি তাই আমি ব্যতিক্রমের ওভারহেড এড়াতে চাই। এটি আগে চেক করা অনেক দ্রুত। আমি পুরানো সিস্টেমটিকে উত্তরাধিকার সূত্রে সাফ পাঠ্য পাসওয়ার্ড থেকে হ্যাশ মানগুলিতে রূপান্তরিত করার চেষ্টা করছি।
ক্রিস মুলিনস

2
টাইলার যে পরামর্শ দিচ্ছেন তার চেয়ে নিয়মিত প্রকাশ কখনই দ্রুত হয় না।
ভিনসেন্ট কোম্যান

আমার পোস্টের নীচে মন্তব্য দেখুন। আমি মনে করি আপনি যে স্ট্রিংগুলির সাথে কাজ করছেন তার দৈর্ঘ্যের উপর নির্ভর করে প্রথমে পরীক্ষা করা আরও দ্রুততর হতে পারে, বিশেষত হ্যাশ পাসওয়ার্ডের মতো ছোট স্ট্রিংয়ের জন্য। এমনকি রেজেক্সে পেতে স্ট্রিংটি 4 এর একাধিক হতে হবে এবং তারপরে একটি ছোট স্ট্রিংয়ের রেজেক্স খুব বড় স্ট্রিংয়ের চেয়ে দ্রুত।
ক্রিস মুলিনস

2
নিখুঁত বিশ্বে, এমন কোনও ব্যক্তির কোড লেখা উচিত নয় যার ব্যবসায়িক যুক্তি ডিজাইন করা হয়েছে বা ব্যতিক্রম ছুঁড়ে ফেলার জন্য পরিচিত। ব্যতিক্রম ট্রাই / ক্যাচ ব্লক সিদ্ধান্ত ব্লক হিসাবে ব্যবহার করা খুব ব্যয়বহুল।
ইসমাইল হাওয়েল

7

কেবল সম্পূর্ণতার স্বার্থে আমি কিছু বাস্তবায়ন সরবরাহ করতে চাই। সাধারণত রেজেক্স বলতে একটি ব্যয়বহুল পন্থা হয়, বিশেষত স্ট্রিং যদি বড় হয় (যা বড় ফাইলগুলি স্থানান্তর করার সময় ঘটে)। নিম্নলিখিত পদ্ধতির সনাক্তকরণের দ্রুততম উপায়গুলি চেষ্টা করে।

public static class HelperExtensions {
    // Characters that are used in base64 strings.
    private static Char[] Base64Chars = new[] { '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', '+', '/' };
    /// <summary>
    /// Extension method to test whether the value is a base64 string
    /// </summary>
    /// <param name="value">Value to test</param>
    /// <returns>Boolean value, true if the string is base64, otherwise false</returns>
    public static Boolean IsBase64String(this String value) {

        // The quickest test. If the value is null or is equal to 0 it is not base64
        // Base64 string's length is always divisible by four, i.e. 8, 16, 20 etc. 
        // If it is not you can return false. Quite effective
        // Further, if it meets the above criterias, then test for spaces.
        // If it contains spaces, it is not base64
        if (value == null || value.Length == 0 || value.Length % 4 != 0
            || value.Contains(' ') || value.Contains('\t') || value.Contains('\r') || value.Contains('\n'))
            return false;

        // 98% of all non base64 values are invalidated by this time.
        var index = value.Length - 1;

        // if there is padding step back
        if (value[index] == '=')
            index--;

        // if there are two padding chars step back a second time
        if (value[index] == '=')
            index--;

        // Now traverse over characters
        // You should note that I'm not creating any copy of the existing strings, 
        // assuming that they may be quite large
        for (var i = 0; i <= index; i++) 
            // If any of the character is not from the allowed list
            if (!Base64Chars.Contains(value[i]))
                // return false
                return false;

        // If we got here, then the value is a valid base64 string
        return true;
    }
}

সম্পাদনা

স্যামের পরামর্শ অনুসারে , আপনি সোর্স কোডটিও সামান্য পরিবর্তন করতে পারেন। তিনি পরীক্ষার শেষ ধাপের জন্য আরও কার্যকর পারফরম্যান্স সরবরাহ করেন। দৈনন্দিন

    private static Boolean IsInvalid(char value) {
        var intValue = (Int32)value;

        // 1 - 9
        if (intValue >= 48 && intValue <= 57) 
            return false;

        // A - Z
        if (intValue >= 65 && intValue <= 90) 
            return false;

        // a - z
        if (intValue >= 97 && intValue <= 122) 
            return false;

        // + or /
        return intValue != 43 && intValue != 47;
    } 

প্রতিস্থাপন করতে ব্যবহার করা যেতে পারে if (!Base64Chars.Contains(value[i]))সাথে লাইনif (IsInvalid(value[i]))

স্যাম থেকে বর্ধিত সামগ্রীর সম্পূর্ণ উত্স কোডটি এর মতো দেখাবে (স্বচ্ছতার জন্য মন্তব্যগুলি সরানো হয়েছে)

public static class HelperExtensions {
    public static Boolean IsBase64String(this String value) {
        if (value == null || value.Length == 0 || value.Length % 4 != 0
            || value.Contains(' ') || value.Contains('\t') || value.Contains('\r') || value.Contains('\n'))
            return false;
        var index = value.Length - 1;
        if (value[index] == '=')
            index--;
        if (value[index] == '=')
            index--;
        for (var i = 0; i <= index; i++)
            if (IsInvalid(value[i]))
                return false;
        return true;
    }
    // Make it private as there is the name makes no sense for an outside caller
    private static Boolean IsInvalid(char value) {
        var intValue = (Int32)value;
        if (intValue >= 48 && intValue <= 57)
            return false;
        if (intValue >= 65 && intValue <= 90)
            return false;
        if (intValue >= 97 && intValue <= 122)
            return false;
        return intValue != 43 && intValue != 47;
    }
}

4

উত্তরটি অবশ্যই স্ট্রিংয়ের ব্যবহারের উপর নির্ভর করবে। বেশ কয়েকটি স্ট্রিং রয়েছে যা বেশ কয়েকটি পোস্টারের প্রস্তাবিত বাক্য গঠন অনুযায়ী "বৈধ বেস 64" হতে পারে, তবে এটি "সঠিকভাবে" ডিকোড হতে পারে, ব্যতিক্রম ছাড়াই, জাঙ্কে to উদাহরণ: 8चारের স্ট্রিংPortland বৈধ বেস 64। এটি বৈধ বেস 64 যা বলার বিন্দুটি কী? আমি অনুমান করি যে কোনও সময় আপনি জানতে চাইবেন যে এই স্ট্রিংটি বেস 64 কে ডিকোড করা উচিত।

আমার ক্ষেত্রে, আমার কাছে ওরাকল সংযোগের স্ট্রিং রয়েছে যা সাধারণ পাঠ্যে যেমন:

Data source=mydb/DBNAME;User Id=Roland;Password=.....`

বা বেস 64 এর মতো

VXNlciBJZD1sa.....................................==

আমাকে কেবল একটি সেমিকোলনের উপস্থিতি পরীক্ষা করতে হবে, কারণ এটি প্রমাণ করে যে এটি বেস 64 নয় যা অবশ্যই উপরের যে কোনও পদ্ধতির চেয়ে দ্রুত than


সম্মত হন, কেস সুনির্দিষ্ট কিছু অতিরিক্ত দ্রুত চেক আরোপ করে। ঠিক যেমন প্লেইন্টেক্সট কানেকশনস্ট্রিং বনাম বেস 64৪ এনকোডড।
ওয়বিক

2

হাই ফুটবলের নিয়মকানুন!

এটি তুলনামূলকভাবে দ্রুত এবং নির্ভুল হওয়া উচিত তবে আমি স্বীকার করি যে আমি এটিকে একটি সম্পূর্ণ পরীক্ষার মাধ্যমে ফেলিনি, মাত্র কয়েকটি।

এটি ব্যয়বহুল ব্যতিক্রমগুলি, রেজেক্সকে এড়িয়ে যায় এবং বৈধতার জন্য ascii রেঞ্জগুলি ব্যবহার করে পরিবর্তে একটি অক্ষর সেট থেকে লুপিং এড়ানো হয়।

public static bool IsBase64String(string s)
    {
        s = s.Trim();
        int mod4 = s.Length % 4;
        if(mod4!=0){
            return false;
        }
        int i=0;
        bool checkPadding = false;
        int paddingCount = 1;//only applies when the first is encountered.
        for(i=0;i<s.Length;i++){
            char c = s[i];
            if (checkPadding)
            {
                if (c != '=')
                {
                    return false;
                }
                paddingCount++;
                if (paddingCount > 3)
                {
                    return false;
                }
                continue;
            }
            if(c>='A' && c<='z' || c>='0' && c<='9'){
                continue;
            }
            switch(c){ 
              case '+':
              case '/':
                 continue;
              case '=': 
                 checkPadding = true;
                 continue;
            }
            return false;
        }
        //if here
        //, length was correct
        //, there were no invalid characters
        //, padding was correct
        return true;
    }

2
public static bool IsBase64String1(string value)
        {
            if (string.IsNullOrEmpty(value))
            {
                return false;
            }
            try
            {
                Convert.FromBase64String(value);
                if (value.EndsWith("="))
                {
                    value = value.Trim();
                    int mod4 = value.Length % 4;
                    if (mod4 != 0)
                    {
                        return false;
                    }
                    return true;
                }
                else
                {

                    return false;
                }
            }
            catch (FormatException)
            {
                return false;
            }
        }

আপনি প্রথমে কেন রূপান্তর করার চেষ্টা করছেন তারপরে অন্য জিনিসগুলিকে নিয়ন্ত্রণ করুন
স্নার

@ স্নর আপনি ঠিক বলেছেন আমি মনে করি এটিই তার পরিবর্তিত হওয়া দরকার: যদি (মান। int mod4 = মান। দৈর্ঘ্য% 4; যদি (মোড 4! = 0) false মিথ্যা প্রত্যাবর্তন করে; } রূপান্তর করুন rom থেকে ব্যস St৪ স্ট্রিং (মান); সত্য প্রত্যাবর্তন; } অন্য {মিথ্যা প্রত্যাবর্তন; }
ওয়াজিদ খান

2

আমি এটির মতো ব্যবহার করব যাতে আমাকে আর রূপান্তর পদ্ধতিতে কল করার দরকার পড়বে না

   public static bool IsBase64(this string base64String,out byte[] bytes)
    {
        bytes = null;
        // Credit: oybek http://stackoverflow.com/users/794764/oybek
        if (string.IsNullOrEmpty(base64String) || base64String.Length % 4 != 0
           || base64String.Contains(" ") || base64String.Contains("\t") || base64String.Contains("\r") || base64String.Contains("\n"))
            return false;

        try
        {
             bytes=Convert.FromBase64String(base64String);
            return true;
        }
        catch (Exception)
        {
            // Handle the exception
        }

        return false;
    }

2

ডিকোড করুন, পুনরায় এনকোড করুন এবং ফলাফলটিকে মূল স্ট্রিংয়ের সাথে তুলনা করুন

public static Boolean IsBase64(this String str)
{
    if ((str.Length % 4) != 0)
    {
        return false;
    }

    //decode - encode and compare
    try
    {
        string decoded = System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(str));
        string encoded = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(decoded));
        if (str.Equals(encoded, StringComparison.InvariantCultureIgnoreCase))
        {
            return true;
        }
    }
    catch { }
    return false;
}

1

ইমো এটি আসলে সম্ভব নয়। সমস্ত পোস্ট সমাধান "টেস্ট" এর মতো স্ট্রিংগুলিতে ব্যর্থ হয়। যদি তাদের 4 টির মধ্যে ভাগ করা যায় তবে তা শূন্য বা খালি হয় না এবং তারা যদি একটি বৈধ বেস 64 অক্ষর হয় তবে তারা সমস্ত পরীক্ষায় উত্তীর্ণ হবে। এটি অনেকগুলি স্ট্রিং হতে পারে ...

সুতরাং এটি কোনও বেস 64 এনকোডড স্ট্রিং তা জেনে অন্য সত্যিকারের সমাধান নেই । আমি যা নিয়ে এসেছি তা হ'ল:

if (base64DecodedString.StartsWith("<xml>")
{
    // This was really a base64 encoded string I was expecting. Yippie!
}
else
{
    // This is gibberish.
}

আমি প্রত্যাশা করি যে ডিকোডড স্ট্রিংটি একটি নির্দিষ্ট কাঠামো দিয়ে শুরু হয়, তাই আমি এটির জন্য পরীক্ষা করি।


0

অবশ্যই। শুধু নিশ্চিত প্রতিটি অক্ষর মধ্যে হয় a-z, A-Z, 0-9, /, অথবা +, এবং স্ট্রিং প্রান্ত ==। (অন্তত, যে সবচেয়ে সাধারণ করুন Base64- বাস্তবায়ন নেই। আপনি কিছু বাস্তবায়নের থেকে ব্যবহার অক্ষর বিভিন্ন পেতে পারে /বা +গত দুই অক্ষরের জন্য।)


যদি আমি বুঝতে পারি, শেষ বর্ণগুলি এনকোডযুক্ত পাঠ্যের চূড়ান্ত দৈর্ঘ্যের উপর নির্ভর করে। সুতরাং যদি এনকোডযুক্ত পাঠ্যটি দৈর্ঘ্য% 4 না হয় তবে '=' অন্তর্ভুক্ত করা হবে।
রাফায়েল দিয়েগো নিকোলেটি

0

হ্যাঁ, বেস 64 এর পর থেকে সীমিত অক্ষর ব্যবহার করে বাইনারি ডেটা ASCII স্ট্রিংগুলিতে এনকোড করে, আপনি কেবল এই নিয়মিত অভিব্যক্তি দিয়ে এটি পরীক্ষা করতে পারেন:

/ ^ [ZA-z0-9 \ = \ + + \ / \ গুলি \ N] $ / সেকেন্ড

স্ট্রিংটিতে কেবল এজেড, এজেড, 0-9, '+', '/', '=' এবং সাদা স্পেস থাকবে তা নিশ্চিত করবে।


এটি সর্বদা বলার একটি নিশ্চিত আগুনের পথ নয়। বেস 64 =অক্ষরটি শেষে আপনার জন্য কিছু প্যাডিং করে । যদি সেই প্যাডিংটি অবৈধ হয় তবে এটি আপনার রেজেক্সের সাথে মিলে গেলেও এটি একটি সঠিক বেস 64 এনকোডিং নয়। আপনি =শেষে 1 বা 2 এর সাথে বেস 64 স্ট্রিংটি সন্ধান করে, সেগুলি সরিয়ে এবং ডিকোড করার চেষ্টা করে এটি ডেমো করতে পারেন ।
vcsjones

আমি বিশ্বাস করি যে ওপি অবৈধ চরিত্রের জন্য ফাঁদ পেতে বলেছে, যদি স্ট্রিং আইনী বেস 64 ছিল না। যদি পরে থাকে তবে আপনি সঠিক, যদিও বেস 64 এ প্যাডিং ত্রুটিগুলি ব্যতিক্রমগুলি ব্যবহার করে ফাঁদে ফেলা সহজ।
রব রাইচ

সত্য নয়, কমপক্ষে বেস 6464 পার্সারের নেট সংস্করণ প্যাডিংকে পুরোপুরি উপেক্ষা করে।
জে

0

আমি কাজটি করার জন্য একটি রেজেক্স তৈরি করার পরামর্শ দেব। আপনাকে এর মতো কিছু পরীক্ষা করতে হবে: [a-zA-Z0-9 + / =] আপনাকে স্ট্রিংয়ের দৈর্ঘ্যও পরীক্ষা করতে হবে। আমি এটির বিষয়ে নিশ্চিত নই, তবে আমি নিশ্চিত যে যদি কিছু ছাঁটাই হয়ে যায় (প্যাডিং "=" ব্যতীত) এটি ফুরিয়ে যায়।

বা আরও ভাল এই স্ট্যাকওভারফ্লো প্রশ্নটি দেখুন


0

আমার সবেমাত্র একটি অনুরূপ প্রয়োজনীয়তা ছিল যেখানে আমি ব্যবহারকারীকে কোনও <canvas>উপাদানটিতে কিছু চিত্রের কারসাজি করতে এবং তারপরে প্রাপ্ত .toDataURL()ফলাফলটিকে ব্যাকএন্ডে প্রেরণ করতে দিচ্ছি । আমি ছবিটি সংরক্ষণ করার আগে কিছু সার্ভার বৈধতা করতে চেয়েছিলাম এবং ValidationAttributeঅন্যান্য উত্তরগুলি থেকে কিছু কোড ব্যবহার করে প্রয়োগ করেছি :

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class Bae64PngImageAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (value == null || string.IsNullOrWhiteSpace(value as string))
            return true; // not concerned with whether or not this field is required
        var base64string = (value as string).Trim();

        // we are expecting a URL type string
        if (!base64string.StartsWith("data:image/png;base64,"))
            return false;

        base64string = base64string.Substring("data:image/png;base64,".Length);

        // match length and regular expression
        if (base64string.Length % 4 != 0 || !Regex.IsMatch(base64string, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None))
            return false;

        // finally, try to convert it to a byte array and catch exceptions
        try
        {
            byte[] converted = Convert.FromBase64String(base64string);
            return true;
        }
        catch(Exception)
        {
            return false;
        }
    }
}

আপনি আমি একটি image / jpeg টাইপ স্ট্রিং, যা ডিফল্টভাবে ফিরে আসেন আশা করছি দেখতে পারেন <canvas>যখন ব্যবহার .toDataURL()


0

বেস 64 বা সাধারণ স্ট্রিং পরীক্ষা করুন

পাবলিক বুল ইসবেস E৪ এনকোডড

{

try

{
    // If no exception is caught, then it is possibly a base64 encoded string
    byte[] data = Convert.FromBase64String(str);
    // The part that checks if the string was properly padded to the
    // correct length was borrowed from d@anish's solution
    return (str.Replace(" ","").Length % 4 == 0);
}
catch
{
    // If exception is caught, then it is not a base64 encoded string
   return false;
}

}


0

সমস্ত উত্তর 1 ফাংশনে হজম করা হয়েছিল যা 100% নিশ্চিত করে যে এর ফলাফলগুলি সঠিক হবে।


1) নীচের মত ফাংশন ব্যবহার করুন:

    string encoded = "WW91ckJhc2U2NHN0cmluZw==";
    msgbox("Is string base64=" + IsBase64(encoded));

2) ফাংশন নীচে:

  public bool IsBase64(string base64String)
    {
        try
        {
            if (!base64String.Length < 1)
            {
                if (!base64String.Equals(Convert.ToBase64String(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(Convert.FromBase64String(base64String)))), StringComparison.InvariantCultureIgnoreCase) & !System.Text.RegularExpressions.Regex.IsMatch(base64String, @"^[a-zA-Z0-9\+/]*={0,2}$"))
                {
                    return false;
                    return;
                }
                if ((base64String.Length % 4) != 0 || string.IsNullOrEmpty(base64String) || base64String.Length % 4 != 0 || base64String.Contains(" ") || base64String.Contains(Constants.vbTab) || base64String.Contains(Constants.vbCr) || base64String.Contains(Constants.vbLf))
                {
                    return false;
                    return;
                }
            }
            else
            {
                return false;
                return;
            }

            return true;
            return;
        }
        catch (FormatException ex)
        {
            return false;
            return;
        }
    }

-1

আমি নিয়মিত এক্সপ্রেশন চেক আইডিয়া পছন্দ করি। নিয়মিত এক্সপ্রেশন দ্রুত হতে পারে এবং অনেক সময় কোডিং ওভারহেড সংরক্ষণ করতে পারে। আসল অনুসন্ধানে একটি আপডেট ছিল যা এটি করেছে। যদিও আমি সন্ধান করি যে আমি কখনও ধরে নিতে পারি না যে স্ট্রিংগুলি শূন্য হবে না। নাল, বা কেবল সাদা অক্ষরের জন্য উত্সের স্ট্রিংটি পরীক্ষা করতে আমি এক্সটেনশন ফাংশনটি প্রসারিত করব।

    public static bool IsBase64String(this string s)
    {
        if (string.IsNullOrWhiteSpace(s))
            return false;

        s = s.Trim();
        return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);

    }

এটি ব্যর্থ হয়। 'আআআ'এর মতো ৪ টি অক্ষরযুক্ত একটি স্ট্রিং পাস করার চেষ্টা করুন।
27
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.