সি # তে বেস 64 ইউআরএল নিরাপদ এনকোডিং কীভাবে অর্জন করবেন?


113

আমি সি # তে বেস 64 ইউআরএল নিরাপদ এনকোডিং অর্জন করতে চাই। জাভাতে, আমাদের কাছে সাধারণ Codecলাইব্রেরি রয়েছে যা আমাকে একটি URL নিরাপদ এনকোডেড স্ট্রিং দেয়। আমি কীভাবে সি # ব্যবহার করে একই অর্জন করতে পারি?

byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);

উপরের কোডটি এটি বেস 64 এ রূপান্তর করে তবে এটি প্যাড করে ==। ইউআরএল নিরাপদ এনকোডিং অর্জন করার উপায় আছে?


4
আপনি কি কেবল Url.Encodeস্ট্রিং-এ ব্যবহার করতে পারবেন না BASE64?

সি # তে কোন নেমস্পেসে ইউআরএল ক্লাস উপস্থিত রয়েছে?
বিশ্বেশ ফাদনিস

একবার দেখে নিন: এমএসডিএন.মাইক্রোসফটকম / en-us / library/… আপনার সমাবেশটি উল্লেখ করতে হবে System.Web

এটি =% তে 3D তে রূপান্তরিত হচ্ছে। আমি এটা চাই না।
বিশ্বেশ ফাদনিস

4
সুতরাং আপনি কি বলতে চাচ্ছেন url safe? %3Dইউআরএল নিরাপদ।

উত্তর:


192

ইউআরএলগুলিতে ব্যবহারের জন্য বর্ণমালাটি অদলবদল করা সাধারণ বিষয় , যাতে কোনও% - এনকোডিং প্রয়োজন হয় না; শুধুমাত্র 65 অক্ষরের 3 সমস্যাযুক্ত রয়েছে - +, /এবং =। সর্বাধিক সাধারণ প্রতিস্থাপনের -স্থানে +এবং _জায়গায় /। প্যাডিংয়ের জন্য: কেবল এটি (দ্য =) সরান ; আপনি পারেন অনুমান প্যাডিং প্রয়োজন পরিমাণ। অন্য প্রান্তে: কেবল প্রক্রিয়াটি বিপরীত করুন:

string returnValue = System.Convert.ToBase64String(toEncodeAsBytes)
        .TrimEnd(padding).Replace('+', '-').Replace('/', '_');

সঙ্গে:

static readonly char[] padding = { '=' };

এবং বিপরীত:

string incoming = returnValue
    .Replace('_', '/').Replace('-', '+');
switch(returnValue.Length % 4) {
    case 2: incoming += "=="; break;
    case 3: incoming += "="; break;
}
byte[] bytes = Convert.FromBase64String(incoming);
string originalText = Encoding.ASCII.GetString(bytes);

তবে মজার প্রশ্নটি হ'ল: "সাধারণ কোডেক লাইব্রেরি" ব্যবহার করা একই পন্থাটি কী? এটি অবশ্যই পরীক্ষার জন্য যুক্তিসঙ্গত প্রথম জিনিস হবে - এটি একটি দুর্দান্ত সাধারণ পদ্ধতি।


4
প্রচলিত কোডে তারা ইউআরএল নিরাপদ মোডের জন্য [0-9a-zA-Z_-] অক্ষর ব্যবহার করছে।
বিশ্বেশ ফাদনিস

এটি ইউএসএল অ্যাপ্লিকেশনগুলির নীচে বেস 64 এর জন্য উইকি পৃষ্ঠায় উল্লেখ করা হয়েছে। en.wikipedia.org/wiki/Base64
wonster

4
আপনার কাছে এই ফাংশনটি রয়েছে ' স্ট্যাকওভারফ্লো.com / প্রশ্নস / 1886686/… ' যা আপনার জন্য সমস্ত কঠোর পরিশ্রম করে।
toy4fun

4
কেন আমাদের দরকার নেই: কেস 1: ইনকামিং + = "==="; বিরতি; ?
অ্যালেক্স দা

4
@alexdafranca কারণ এটির দৈর্ঘ্যের Mod 4 কখনই হবে না 3x 3x8 বিট 4x6 বিট হয়ে যায় (এবং প্রতিটি 6 টি বিট নির্বাচিত বর্ণমালার মধ্যে 64 টির মধ্যে একটি), 0x8 বিটগুলি প্যাডিং ছাড়াই 0x6 বিট হিসাবে এনকোড করা হয়, 1x8 বিট হিসাবে এনকোড থাকে ==প্যাডিং সহ 2x6 বিটস , 2x8 =প্যাডিং সহ 3x6 হিসাবে এনকোড করা হয়েছে, 3x8 প্যাডিং ছাড়াই 4x6 হিসাবে এনকোড করা হয়েছে এবং তারপরে এটি সংযুক্ত করা হয়েছে যাতে এটি পুনরাবৃত্তি করে। 1x6 বিটগুলিতে কোনও কিছুই এনকোড করা হয় না, তাই আপনার কখনও ===প্যাডিংয়ের দরকার নেই ।
জর্জ হিলিয়ার

89

আপনি Base64UrlEncoderনেমস্পেস থেকে ক্লাস ব্যবহার করতে পারেন Microsoft.IdentityModel.Tokens

const string StringToEncode = "He=llo+Wo/rld";

var encodedStr = Base64UrlEncoder.Encode(StringToEncode);
var decodedStr = Base64UrlEncoder.Decode(encodedStr);

if (decodedStr == StringToEncode)
    Console.WriteLine("It works!");
else
    Console.WriteLine("Dangit!");

4
এটি গৃহীত উত্তরের চেয়ে অনেক পরিষ্কার। কোন খারাপ দিক?
taktak004

21
কেবল একটি নোট: মাইক্রোসফ্ট.আইডেন্টিটি মডেল.টোকেনস একটি নুগেট প্যাকেজ যা ডাউনলোড করতে হবে।
উবার শ্নুজ

আমি নাম ধরে ধরে নিচ্ছি যে এটি ক্রস প্ল্যাটফর্ম নয়। এটাই কি?
ব্র্যান্ডন এস

27

অন্য একটি বিকল্প, আপনি যদি এএসপি.এনইটি কোর ব্যবহার করেন তবে এটি ব্যবহার করা হবে Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode

আপনি যদি এএসপি.নেট কোর ব্যবহার না করে থাকেন তবে WebEncodersউত্সটি অ্যাপাচি ২.০ লাইসেন্সের অধীনে উপলব্ধ ।


8

কিছু কার্যকারিতা উন্নতির সাথে এখানে উত্তরগুলির ভিত্তিতে, আমরা গিটহাবের (এমআইটি লাইসেন্সযুক্ত) সোর্স কোড সহ নুগেটে ইউআরএল-নিরাপদ বেস 64 ব্যবহারের খুব সহজেই প্রকাশ করেছি ।

ব্যবহার হিসাবে হিসাবে সহজ

var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);

আশ্চর্যজনক আপনাকে ধন্যবাদ। আগ্রহের বাইরে আপনি কেন "string".Replaceএই encodeপদ্ধতির পক্ষে বেছে নিয়েছেন , তবে ম্যানুয়াল সহ একটি লুপ এর পরিবর্তে decode?
10 ʙᴀᴋᴇʀ

@। আমার এটিটি আবার ঘুরে দেখার এবং কয়েকটি মানদণ্ড চালানো দরকার, তবে এটি কারণ আমরা পরেরটিগুলিতে যুক্ত করি তাই এটি অক্ষরযুক্ত স্ট্রিংয়ের পরিবর্তে অক্ষরের বর্ধনযোগ্য তালিকা দ্বারা প্রতিনিধিত্ব করে।
মাহমুদ আল-কুদসি

পরিবর্তে = স্ট্রিং সহ আরও একটি শ্রেণি: github.com/vndevpro/architecture-common/blob/master/…
হাইজ্যাক

8

URL- নিরাপদ বেস 64-এর মতো এনকোডিং পেতে, তবে আরএফসি 4648 অনুযায়ী "বেস64url" নয়, System.Web.HttpServerUtility.UrlTokenEncode(bytes)এনকোড এবং System.Web.HttpServerUtility.UrlTokenDecode(bytes)ডিকোড করতে ব্যবহার করুন।


7
এটি আরএফসি 4648 অনুসারে ইউআরএল-নিরাপদ বেস 64 এনকোডিং অনুসারে মানক সরবরাহ করে না। এই প্রশ্নোত্তরও দেখুন । সতর্কতার সাথে ব্যবহার করুন.
আর্টজম বি।

1

সহজ সমাধান: (কোনও প্যাড ছাড়াই)

private static string Base64UrlEncode(string input) {
    var inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
    // Special "url-safe" base64 encode.
    return Convert.ToBase64String(inputBytes)
      .Replace('+', '-') // replace URL unsafe characters with safe ones
      .Replace('/', '_') // replace URL unsafe characters with safe ones
      .Replace("=", ""); // no padding
  }

ক্রেডিট যায়: থোলে


0

এখানে ইউআরএল-নিরাপদ বেস 64 ডিকোড করার অন্য পদ্ধতিটি মার্কের সাথে একইভাবে এনকোড করা হয়েছিল। আমি কেন পাই না কেন 4-length%4এটি কাজ করে (এটি করে)।

নীচে, শুধুমাত্র উত্সের বিট দৈর্ঘ্য 6 এবং 8 এর সাধারণ একাধিক, বেস 64 ফলাফলের জন্য "=" সংযোজন করে না।

1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8|1 2 3 4 5 6 7 8 
1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6|1 2 3 4 5 6
                "=="            "="

সুতরাং আমরা বিপরীতভাবে এটি করতে পারি, ফলাফলের বিট দৈর্ঘ্য যদি 8 দ্বারা বিভাজ্য না হয়, এটি যুক্ত করা হয়েছে:

base64String = base64String.Replace("-", "+").Replace("_", "/");
var base64 = Encoding.ASCII.GetBytes(base64String);
var padding = base64.Length * 3 % 4;//(base64.Length*6 % 8)/2
if (padding != 0)
{
    base64String = base64String.PadRight(base64String.Length + padding, '=');
}
return Convert.FromBase64String(base64String);

0

ইউডাব্লুপিতে মাইক্রোসফ্ট ক্রিপ্টোগ্রাফিক ইঞ্জিন ব্যবহার করা।

uint length = 32;

IBuffer buffer = CryptographicBuffer.GenerateRandom(length);
string base64Str = CryptographicBuffer.EncodeToBase64String(buffer)
                   // ensure url safe
                   .TrimEnd('=').Replace('+', '-').Replace('/', '_');

return base64Str;

0

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

var bytesToEncode = System.Text.Encoding.UTF8.GetBytes("StringToEncode"); 
var bytesEncodedPadded = HttpServerUtility.UrlTokenEncode(bytesToEncode);
var objectIdBase64 = bytesEncodedPadded.Substring(0, bytesEncodedPadded.Length - 1);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.