একটি পরিবর্তিত বেস 64 URL ডিকোডিং / এনকোডিংয়ের কোড


113

আমি এটিকে একটি ইউআরএল রাখতে 64৪ টি এনকোড ডেটা বেস করতে চাই এবং তারপরে এটি আমার এইচটিটিপিএইচেন্ডেলার মধ্যে ডিকোড করব।

আমি খুঁজে পেয়েছি যে বেস 64৪ এনকোডিং একটি '/' অক্ষরের জন্য মঞ্জুরি দেয় যা আমার ইউরিপ্লেপলেট মিলকে গোলমেলে ফেলবে। তারপরে আমি দেখতে পেলাম যে উইকিপিডিয়া থেকে "URL এর জন্য পরিবর্তিত বেস 64" এর ধারণা রয়েছে:

ইউআরএল বৈকল্পিকের জন্য একটি পরিবর্তিত বেস 64 উপস্থিত রয়েছে, যেখানে কোনও 'প্যাডিং' = 'ব্যবহৃত হবে না এবং আদর্শ বেস 64 এর' + 'এবং' / 'অক্ষর যথাক্রমে' - 'এবং' _ 'দ্বারা প্রতিস্থাপিত হবে, যাতে URL এনকোডার / ডিকোডার ব্যবহার করে আর প্রয়োজন হয় না এবং এনকোডযুক্ত মানের দৈর্ঘ্যের উপর কোনও প্রভাব ফেলবে না, একইভাবে এনকোডযুক্ত ফর্মটি আপেক্ষিক ডাটাবেস, ওয়েব ফর্ম এবং অবজেক্ট আইডেন্টিফায়ারিকে সাধারণভাবে ব্যবহারের জন্য অক্ষত রেখে দেয়।

.NET ব্যবহার করে আমি "ইউআরএল জন্য পরিবর্তিত বেস 64" পদ্ধতি ব্যবহার করে বেসিক বেস 64 এনকোডিং এবং ডিকোডিং থেকে আমার বর্তমান কোডটি সংশোধন করতে চাই। কেউ কি এই কাজ করেছে?

ডিকোড করার জন্য, আমি জানি এটির এমন কিছু দিয়ে শুরু হয়:

string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');

// Append '=' char(s) if necessary - how best to do this?

// My normal base64 decoding now uses encodedText

তবে, আমি শেষ পর্যন্ত এক বা দুটি '=' অক্ষর যুক্ত করতে চাই যা কিছুটা আরও জটিল দেখায়।

আমার এনকোডিং যুক্তিটি কিছুটা সহজ হওয়া উচিত:

// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);

// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');

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


@ কার্ক: পরীক্ষিত গণিতের সাথে আমার উত্তরটি সামঞ্জস্য করুন।
অ্যান্টনি ডাব্লু জোন্স 21

উত্তর:


69

এটি সঠিকভাবে প্যাড করা উচিত: -

 base64 = base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '=');

11
বাহ, তুমি আমাকে মারছ। আমি কেবল আমার পোস্টটি মুছে ফেলব কারণ দেখে মনে হচ্ছে আমি আপনাকে অনুলিপি করেছি :)
অ্যারোনলএস

3
এটি তিনটি '=' অক্ষর যোগ করবে না? দেখা যাচ্ছে যে এর মধ্যে কেবল 0, 1 বা 2 থাকবে।
কर्क লিমোহন

1
@ কির্ক: যদি এটি 3 টি অক্ষর যুক্ত করে তবে বেস 64 স্ট্রিং ইতিমধ্যে দূষিত। আমি অনুমান এটা স্ট্রিং যাচাই করতে একটি ভাল ধারণা, এটি শুধুমাত্র অক্ষর প্রত্যাশিত থাকা উচিত এবং দৈর্ঘ্য% 4 হবে = 3.!
AnthonyWJones

হুম। এটি চেষ্টা করে দেখতে, এটি কৌশলটি করছে না। এখনও উত্তর খুঁজছি। সমান চিহ্নগুলির সংখ্যা ঠিকভাবে প্যান আউট করছে না।
কर्क লিমোহন

2
@ অ্যান্থনিডাব্লু জোন্স 'এর মধ্যে কেবলমাত্র প্রত্যাশিত অক্ষর এবং দৈর্ঘ্য% 4! = 1 ' থাকা উচিত, তাই না?
ব্লু করা হচ্ছে

173

ইউআরএল নিরাপদ বেস 64 এনকোডিং এবং ডিকোডিং হ্যান্ডল করছে এমন urlTokenEncode এবং UrlTokenDecode পদ্ধতিগুলির সাথে ক্লাস এইচটিপিএস সার্ভার ইউটিলিটিটি পরীক্ষা করুন ।

নোট 1: ফলাফলটি কোনও বৈধ বেস 64 স্ট্রিং নয়। URL- এর জন্য কিছু অনিরাপদ অক্ষর প্রতিস্থাপন করা হয়েছে।

দ্রষ্টব্য 2: ফলাফল আরএফসি 4648 এর বেস 64url অ্যালগরিদম থেকে পৃথক।

///<summary>
/// Base 64 Encoding with URL and Filename Safe Alphabet using UTF-8 character set.
///</summary>
///<param name="str">The origianl string</param>
///<returns>The Base64 encoded string</returns>
public static string Base64ForUrlEncode(string str)
{
    byte[] encbuff = Encoding.UTF8.GetBytes(str);
    return HttpServerUtility.UrlTokenEncode(encbuff);
}
///<summary>
/// Decode Base64 encoded string with URL and Filename Safe Alphabet using UTF-8.
///</summary>
///<param name="str">Base64 code</param>
///<returns>The decoded string.</returns>
public static string Base64ForUrlDecode(string str)
{
    byte[] decbuff = HttpServerUtility.UrlTokenDecode(str);
    return Encoding.UTF8.GetString(decbuff);
}

বখশিশের জন্য ধন্যবাদ. আমি পরের বার চেষ্টা করব!
কર્ક লিমনহান

12
আপনার টিপটি উত্তরের জন্য বহু ঘন্টা এবং হেয়ার টুফ্ট অনুসন্ধানের গৌরবময় সমাপ্তি ছিল। ধন্যবাদ
প্রেসাগাস

এটি কি প্রতিটি / + এবং = এর জন্য% এনকোডিং ব্যবহার করবে না? এটি অন্য উত্তরের মতো দক্ষ নয়
জোয়েলফ্যান

না, এটি প্যাডিংয়ের জন্য ব্যবহৃত সমান চিহ্নগুলির পরিবর্তে একটি সংখ্যা এবং বিকল্প প্লাস এবং বিয়োগ এবং আন্ডারস্কোর সহ স্ল্যাশ প্রতিস্থাপন করে।
ফ্রেডরিক হাগলুন্ড

15
দ্রষ্টব্য যে UrlTokenEncodeভিত্তি 6464 নয় , কারণ এটি '=' প্যাডিংয়ের পরিবর্তে '0', '1' বা '2' এর পরিবর্তে কতটি সমান চিহ্নের পরিবর্তিত হয়েছে তার উপর নির্ভর করে।
14-18

28

মন্তব্য করার মতো পর্যাপ্ত পয়েন্ট নয়, তবে এটি যদি সহায়তা করে তবে সুশীল প্রদত্ত লিঙ্কটিতে যে কোড স্নিপেটটি খুঁজে পেয়েছিল (জেএসওএন ওয়েব সিগনেচার আইটিএফ খসড়া) ইউআরএল-তে বেস 64৪ এ এনকোড করার সময় কাজ করে।

যারা অলস তাদের জন্য নীচে অনুলিপি করা হয়েছে:

    static string Base64UrlEncode(byte[] arg)
    {
        string s = Convert.ToBase64String(arg); // Regular base64 encoder
        s = s.Split('=')[0]; // Remove any trailing '='s
        s = s.Replace('+', '-'); // 62nd char of encoding
        s = s.Replace('/', '_'); // 63rd char of encoding
        return s;
    }

    static byte[] Base64UrlDecode(string arg)
    {
        string s = arg;
        s = s.Replace('-', '+'); // 62nd char of encoding
        s = s.Replace('_', '/'); // 63rd char of encoding
        switch (s.Length % 4) // Pad with trailing '='s
        {
            case 0: break; // No pad chars in this case
            case 2: s += "=="; break; // Two pad chars
            case 3: s += "="; break; // One pad char
            default: throw new System.Exception(
              "Illegal base64url string!");
        }
        return Convert.FromBase64String(s); // Standard base64 decoder
    }

এটি সিস্টেমটি ব্যবহার না করার জন্য জামারিনের সাথে সামঞ্জস্যপূর্ণ e ওয়েবে
রেজা

ঠিক আমি খুঁজছেন ছিল কি! লাইব্রেরিতে না টানিয়া জামারিনের পক্ষে সত্যই ভাল বিকল্প।
ঘুমন্ত_জায়েন্ট

19

বেস64 hitrl এনকোডিংয়ের জন্য এনকোড / ডিকোড করার কোডটি সন্ধান করার সময় আমি এখানে আঘাত করেছি যা প্রশ্নের উত্তর অনুসারে বেস 64 এর চেয়ে কিছুটা আলাদা।

এই দস্তাবেজে সি # কোড স্নিপেট পাওয়া গেছে। JSON ওয়েব স্বাক্ষর আইটিএফ খসড়া


2
GMail API v1 (বার্তা.রো।)
হেইজিকো

5

গৃহীত উত্তরের তুলনায়, আপনি এখানে সি # ব্যবহার করে কিভাবে বেস বেস 64 এনকোডেড ইউআরএলটিকে মৌলিকভাবে ডিকোড করবেন :

ডিকোড:

string codedValue = "base64encodedUrlHere";

string decoded;
byte[] buffer =  Convert.FromBase64String(codedValue);
decoded = Encoding.UTF8.GetString(buffer);

আপনি যদি স্বীকৃত উত্তরের সাথে আরও বিশদ বিবরণ এবং তুলনা সরবরাহ করেন তবে আপনি একটি উত্তোলন পেতে পারেন - ধন্যবাদ
মরিসিও গ্র্যাসিয়া গুতেরেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.