c# - আমি সি এন#এ কোনও এনকোডিং নির্দিষ্ট না করে স্ট্রিংগুলির সামঞ্জস্যপূর্ণ বাইট উপস্থাপনাটি কীভাবে পেতে পারি?




.net string (20)

এছাড়াও কেন এনকোডিং বিবেচনা করা উচিত ব্যাখ্যা করুন। আমি স্ট্রিং সংরক্ষণ করা হয়েছে কি বাইট সহজেই পেতে পারি না? এনকোডিং কেন এই নির্ভরতা?

কারণ "স্ট্রিং এর বাইট" হিসাবে কোন জিনিস নেই।

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

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

সুতরাং, সংক্ষেপে, "এনকোডিংগুলি ব্যবহার না করেই স্ট্রিংয়ের বাইটগুলি পেতে" চেষ্টা করা "অসম্ভব ভাষা ব্যবহার না করেই পাঠ্য লেখার" মতো অসম্ভব।

যাইহোক, আমি দৃঢ়ভাবে এই জ্ঞানের ছোট্ট অংশটি পড়ার জন্য আপনাকে (এবং যে কেউ এই বিষয়ে) সুপারিশ করছি: joelonsoftware.com/articles/Unicode.html

কিভাবে একটি string একটি নির্দিষ্ট এনকোডিং নির্দিষ্টভাবে উল্লেখ না করেই আমি নেটতে (C #) একটি byte[] পরিবর্তন করতে পারি?

আমি স্ট্রিং এনক্রিপ্ট করতে যাচ্ছি। আমি রূপান্তরিত না করে এটি এনক্রিপ্ট করতে পারি, তবে আমি এখনও জানতে চাই কেন এনকোডিং এখানে খেলতে আসে।

এছাড়াও কেন এনকোডিং বিবেচনা করা উচিত? আমি স্ট্রিং সংরক্ষণ করা হয়েছে কি বাইট সহজেই পেতে পারি না? চরিত্র এনকোডিং উপর একটি নির্ভরশীলতা কেন?


কিভাবে একটি স্ট্রিংকে একটি নির্দিষ্ট এনকোডিং নির্দিষ্টভাবে উল্লেখ না করেই আমি নেটতে (C #) একটি স্ট্রিট [] পরিবর্তন করতে পারি?

.নেটে একটি string টেক্সটটি UTF-16 কোড ইউনিটগুলির ক্রম হিসাবে উপস্থাপন করে, তাই বাইট ইতিমধ্যে UTF-16 এ মেমরিতে এনকোড করা হয়।

মেহেরদদের উত্তর

আপনি মেহেরদাদের উত্তরটি ব্যবহার করতে পারেন , তবে এটি আসলে এনকোডিং ব্যবহার করে কারণ অক্ষরটি UTF-16। এটা তোলে ToCharArray যা এ খুঁজছেন আহ্বান উৎস একটি সৃষ্টি char[]সরাসরি প্রয়োজন এবং মেমরি কপি। তারপরে এটি বরাদ্দ করা একটি বাইট অ্যারেতে ডেটা অনুলিপি করে। সুতরাং হুডের অধীনে এটি অন্তর্নিহিত বাইটগুলি দুইবার অনুলিপি করছে এবং একটি গৃহস্থালি অ্যারে বরাদ্দ করছে যা কলটির পরে ব্যবহার করা হয় না।

টম Blodget এর উত্তর

মেহেরদাদের তুলনায় টম ব্লজগেটের উত্তর ২0-30% দ্রুততর, কারণ এটি একটি গৃহস্থালি অ্যারে বরাদ্দ করার মধ্যবর্তী পদক্ষেপ এবং এতে বাইটগুলি অনুলিপি করে, তবে এটির জন্য আপনার /unsafeবিকল্পটি সংকলন করা প্রয়োজন । যদি আপনি একেবারে এনকোডিং ব্যবহার করতে চান না, তবে আমার মনে হয় এটি যাওয়ার উপায়। আপনি যদি fixedব্লকের ভিতরে আপনার এনক্রিপশন লগইন রাখেন, তবে আপনাকে একটি পৃথক বাইট অ্যারে বরাদ্দ করতে হবে না এবং এতে বাইটগুলি অনুলিপি করতে হবে।

এছাড়াও কেন এনকোডিং বিবেচনা করা উচিত? আমি স্ট্রিং সংরক্ষণ করা হয়েছে কি বাইট সহজেই পেতে পারি না? চরিত্র এনকোডিং উপর একটি নির্ভরশীলতা কেন?

কারণ এটি করার সঠিক উপায়। stringএকটি বিমূর্তন।

যদি আপনার অকার্যকর অক্ষরগুলির সাথে 'স্ট্রিং' থাকে তবে একটি এনকোডিং ব্যবহার করলে আপনাকে সমস্যা হতে পারে, তবে তা ঘটতে না পারে। আপনি অবৈধ অক্ষর দিয়ে আপনার স্ট্রিং মধ্যে তথ্য পাচ্ছেন যদি আপনি এটা ভুল করছেন। আপনি সম্ভবত একটি বাইট অ্যারে বা একটি বেস64 এনকোডিং দিয়ে শুরু করতে হবে।

আপনি ব্যবহার করলে System.Text.Encoding.Unicode, আপনার কোড আরো স্থিতিশীল হবে। আপনি আপনার কোড চলমান সিস্টেমের endianness সম্পর্কে চিন্তা করতে হবে না । যদি আপনি CLR এর পরবর্তী সংস্করণটি একটি ভিন্ন অভ্যন্তরীণ অক্ষর এনকোডিং ব্যবহার করেন তবে আপনাকে চিন্তা করতে হবে না।

আমি মনে করি কেন আপনি এনকোডিং সম্পর্কে চিন্তা করতে চান না, তবে কেন আপনি এটি উপেক্ষা করতে চান এবং অন্য কিছু ব্যবহার করতে চান। এনকোডিং বাইট একটি ক্রম একটি স্ট্রিং এর বিমূর্তন প্রতিনিধিত্ব বোঝানো হয়। System.Text.Encoding.Unicodeআপনাকে একটি সামান্য এন্ডিয়ান বাইট অর্ডার এনকোডিং দেবে এবং প্রতিটি সিস্টেম, এখন এবং ভবিষ্যতে একই সঞ্চালন করবে।


এখানে উত্তরগুলির বিপরীতে, বাইটগুলি ব্যাখ্যা করা দরকার না হলে আপনাকে এনকোডিং সম্পর্কে চিন্তা করতে হবে না!

আপনি উল্লেখ করেছেন, আপনার লক্ষ্য, কেবল "স্ট্রিং সংরক্ষণ করা হয়েছে কি বাইট পেতে"
(এবং, অবশ্যই, বাইট থেকে স্ট্রিং পুনরায় তৈরি করতে সক্ষম হবেন।)

সেই লক্ষ্যগুলির জন্য, আমি সৎভাবে বুঝতে পারছি না কেন লোকেরা আপনাকে বলছে যে আপনি এনকোডিংগুলির প্রয়োজন। আপনি অবশ্যই এই জন্য এনকোডিং সম্পর্কে চিন্তা করতে হবে না।

শুধু এর পরিবর্তে এটি করুন:

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

static string GetString(byte[] bytes)
{
    char[] chars = new char[bytes.Length / sizeof(char)];
    System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
    return new string(chars);
}

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

এই পদ্ধতির অতিরিক্ত সুবিধা:

স্ট্রিংটি অবৈধ অক্ষর ধারণ করে তবে এটি কোন ব্যাপার না, কারণ আপনি এখনও তথ্য পেতে এবং মূল স্ট্রিং পুনর্নির্মাণ করতে পারেন!

এটি এনকোড করা এবং ডিকোড করা হবে, কারণ আপনি কেবল বাইটগুলি দেখছেন

আপনি যদি একটি নির্দিষ্ট এনকোডিং ব্যবহার করেন তবে, এটি আপনাকে এনকোডিং / ডিকোডিং অবৈধ অক্ষরগুলির সাথে সমস্যা দেখা দেবে।


আচ্ছা, আমি সব উত্তর পড়েছি এবং তারা এনকোডিং ব্যবহার করছেন অথবা সিরিয়ালাইজেশন সম্পর্কে এক যা অপরিকল্পিত surrogates ড্রপ।

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

তাই আমি এই ক্ষেত্রে বাইট অ্যারেগুলির Base64 এনকোডিং ব্যবহার করি, কিন্তু হেই, ইন্টারনেটে সি # এ এটির একমাত্র সমাধান রয়েছে এবং এটিতে বাগ রয়েছে এবং এটি কেবল একটি উপায়, তাই আমি বাগ সংশোধন করেছি এবং ব্যাকলিঙ্ক করেছি কার্যপ্রণালী। এখানে আপনি, ভবিষ্যতে googlers:

public static byte[] StringToBytes(string str)
{
    byte[] data = new byte[str.Length * 2];
    for (int i = 0; i < str.Length; ++i)
    {
        char ch = str[i];
        data[i * 2] = (byte)(ch & 0xFF);
        data[i * 2 + 1] = (byte)((ch & 0xFF00) >> 8);
    }

    return data;
}

public static string StringFromBytes(byte[] arr)
{
    char[] ch = new char[arr.Length / 2];
    for (int i = 0; i < ch.Length; ++i)
    {
        ch[i] = (char)((int)arr[i * 2] + (((int)arr[i * 2 + 1]) << 8));
    }
    return new String(ch);
}

আপনার প্রশ্নের প্রথম অংশটি (বাইটগুলি কীভাবে পেতে হয়) অন্যদের দ্বারা ইতিমধ্যে উত্তর দেওয়া হয়েছে: System.Text.Encoding নামস্থান দেখুন।

আমি আপনার ফলোআপ প্রশ্নটি ঠিক করবো: কেন আপনি একটি এনকোডিং বাছাই করতে হবে? কেন আপনি স্ট্রিং ক্লাস নিজেই থেকে যে পেতে পারি না?

উত্তর দুটি অংশে হয়।

প্রথমত, স্ট্রিং ক্লাসের অভ্যন্তরে অভ্যন্তরীণভাবে ব্যবহৃত বাইটগুলি কোনও ব্যাপার নয় এবং যখনই আপনি মনে করেন যে আপনি সম্ভবত একটি বাগ উপস্থাপন করছেন।

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

অন্যদিকে, আপনি যদি এই বাইটগুলি কোথাও পাঠাচ্ছেন তবে আপনি গ্যারান্টি দিতে পারবেন না। নেট সেরিয়ালাইজড স্ট্রিম থেকে ডেটা টানবে? এই ক্ষেত্রে আপনি স্পষ্টভাবে এনকোডিং সম্পর্কে চিন্তা করতে হবে, কারণ সম্ভবত এই বহিরাগত সিস্টেম বজায় রাখে। আবার, স্ট্রিং দ্বারা ব্যবহৃত অভ্যন্তরীণ বাইটগুলি কোনও ব্যাপার নয়: আপনাকে একটি এনকোডিং বাছাই করতে হবে যাতে আপনি এই এনকোডিং সম্পর্কে স্পষ্ট হতে পারেন, এমনকি যদি এটি একই এনকোডিং অভ্যন্তরীণভাবে ব্যবহৃত হয়। নেট।

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

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

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


এটি আপনার স্ট্রিং এর এনকোডিং ( ASCII , UTF-8 , ...) উপর নির্ভর করে।

উদাহরণ স্বরূপ:

byte[] b1 = System.Text.Encoding.UTF8.GetBytes (myString);
byte[] b2 = System.Text.Encoding.ASCII.GetBytes (myString);

কেন এনকোডিং গুরুত্বপূর্ণ একটি ছোট নমুনা:

string pi = "\u03a0";
byte[] ascii = System.Text.Encoding.ASCII.GetBytes (pi);
byte[] utf8 = System.Text.Encoding.UTF8.GetBytes (pi);

Console.WriteLine (ascii.Length); //Will print 1
Console.WriteLine (utf8.Length); //Will print 2
Console.WriteLine (System.Text.Encoding.ASCII.GetString (ascii)); //Will print '?'

ASCII কেবল বিশেষ অক্ষর মোকাবেলা সজ্জিত করা হয় না।

অভ্যন্তরীণভাবে, .NET ফ্রেমওয়ার্কটি স্ট্রিংগুলি উপস্থাপনের জন্য UTF-16 ব্যবহার করে, তাই যদি আপনি সহজেই সঠিক বাইটগুলি পেতে চান যা .NET ব্যবহার করে তবে System.Text.Encoding.Unicode.GetBytes (...) ব্যবহার করুন।

আরো তথ্যের জন্য .NET ফ্রেমওয়ার্ক (এমএসডিএন) তে ক্যারেক্টার এনকোডিং দেখুন।


এটি চেষ্টা করুন, অনেক কম কোড:

System.Text.Encoding.UTF8.GetBytes("TEST String");

গ্রহণযোগ্য উত্তর খুবই জটিল। এই জন্য অন্তর্ভুক্ত .NET ক্লাস ব্যবহার করুন:

const string data = "A string with international characters: Norwegian: ÆØÅæøå, Chinese: 喂 谢谢";
var bytes = System.Text.Encoding.UTF8.GetBytes(data);
var decoded = System.Text.Encoding.UTF8.GetString(bytes);

যদি আপনাকে চলাচল করতে না হয় তবে চাকাটি পুনর্বিবেচনা করবেন না ...


LINQ সঙ্গে সহজ কোড

string s = "abc"
byte[] b = s.Select(e => (byte)e).ToArray();

সম্পাদনা করুন: নীচের মন্তব্য হিসাবে, এটি একটি ভাল উপায় নয়।

কিন্তু আপনি এখনও আরও উপযুক্ত কোডিং সহ LINQ বুঝতে এটি ব্যবহার করতে পারেন:

string s = "abc"
byte[] b = s.Cast<byte>().ToArray();

দ্রুততম উপায়

public static byte[] GetBytes(string text)
{
    return System.Text.ASCIIEncoding.UTF8.GetBytes(text);
}

Makotosan হিসাবে সম্পাদনা করুন এই এখন সবচেয়ে ভাল উপায় মন্তব্য:

Encoding.UTF8.GetBytes(text)

দুটো রাস্তা:

public static byte[] StrToByteArray(this string s)
{
    List<byte> value = new List<byte>();
    foreach (char c in s.ToCharArray())
        value.Add(c.ToByte());
    return value.ToArray();
}

এবং,

public static byte[] StrToByteArray(this string s)
{
    s = s.Replace(" ", string.Empty);
    byte[] buffer = new byte[s.Length / 2];
    for (int i = 0; i < s.Length; i += 2)
        buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
    return buffer;
}

আমি উপরে তুলনায় নীচে এক আরো প্রায়ই ব্যবহার ঝোঁক, গতি জন্য তাদের benchmarked না।


ব্যবহার করুন:

    string text = "string";
    byte[] array = System.Text.Encoding.UTF8.GetBytes(text);

ফলাফল হলো:

[0] = 115
[1] = 116
[2] = 114
[3] = 105
[4] = 110
[5] = 103

C # stringএকটি byteঅ্যারের রূপান্তর করতে :

public static byte[] StrToByteArray(string str)
{
   System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
   return encoding.GetBytes(str);
}

আপনি একটি রূপান্তর করতে নিম্নলিখিত কোড ব্যবহার করতে পারেন stringএকটি থেকে byte array.NET মধ্যে

string s_unicode = "abcéabc";
byte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(s_unicode);

আমি নিশ্চিত নই, তবে আমার মনে হয় স্ট্রিং তার চরগুলির অ্যারের মতো তথ্য সঞ্চয় করে, যা বাইটের সাথে অক্ষম। বিশেষত, একটি চর সংজ্ঞা "একটি ইউনিকোড চরিত্র প্রতিনিধিত্ব করে" হয়।

এই উদাহরণ নমুনা নিতে:

String str = "asdf éß";
String str2 = "asdf gh";
EncodingInfo[] info =  Encoding.GetEncodings();
foreach (EncodingInfo enc in info)
{
    System.Console.WriteLine(enc.Name + " - " 
      + enc.GetEncoding().GetByteCount(str)
      + enc.GetEncoding().GetByteCount(str2));
}

ইউনিকোড উত্তরটি উভয় ক্ষেত্রে 14 বাইটের কথা মনে রাখবেন, যেখানে UTF-8 উত্তর প্রথমটির জন্য মাত্র 9 বাইট এবং দ্বিতীয়টির জন্য মাত্র 7।

সুতরাং আপনি কেবল স্ট্রিং দ্বারা ব্যবহৃত বাইট চান, কেবল ব্যবহার Encoding.Unicode, কিন্তু এটি স্টোরেজ স্পেস সঙ্গে অক্ষম হবে।


এখানে আমার অনিরাপদ বাস্তবায়ন Stringকরতে Byte[]রূপান্তর:

public static unsafe Byte[] GetBytes(String s)
{
    Int32 length = s.Length * sizeof(Char);
    Byte[] bytes = new Byte[length];

    fixed (Char* pInput = s)
    fixed (Byte* pBytes = bytes)
    {
        Byte* source = (Byte*)pInput;
        Byte* destination = pBytes;

        if (length >= 16)
        {
            do
            {
                *((Int64*)destination) = *((Int64*)source);
                *((Int64*)(destination + 8)) = *((Int64*)(source + 8));

                source += 16;
                destination += 16;
            }
            while ((length -= 16) >= 16);
        }

        if (length > 0)
        {
            if ((length & 8) != 0)
            {
                *((Int64*)destination) = *((Int64*)source);

                source += 8;
                destination += 8;
            }

            if ((length & 4) != 0)
            {
                *((Int32*)destination) = *((Int32*)source);

                source += 4;
                destination += 4;
            }

            if ((length & 2) != 0)
            {
                *((Int16*)destination) = *((Int16*)source);

                source += 2;
                destination += 2;
            }

            if ((length & 1) != 0)
            {
                ++source;
                ++destination;

                destination[0] = source[0];
            }
        }
    }

    return bytes;
}

এটা গ্রহণযোগ্য anwser এর চেয়ে দ্রুত উপায়, এমনকি হিসাবে মার্জিত হিসাবে না। এখানে আমার স্টপওয়াচ বেঞ্চমার্ক 10000000 পুনরাবৃত্তি উপর আছে:

[Second String: Length 20]
Buffer.BlockCopy: 746ms
Unsafe: 557ms

[Second String: Length 50]
Buffer.BlockCopy: 861ms
Unsafe: 753ms

[Third String: Length 100]
Buffer.BlockCopy: 1250ms
Unsafe: 1063ms

এটি ব্যবহার করার জন্য, আপনার প্রোজেক্ট বিল্ড বৈশিষ্ট্যগুলিতে আপনাকে "অনিরাপদ কোড অনুমতি দিন" টিক চিহ্ন দিতে হবে। .NET ফ্রেমওয়ার্ক 3.5 অনুসারে, এই পদ্ধতিটি স্ট্রিং এক্সটেনশন হিসাবেও ব্যবহার করা যেতে পারে:

public static unsafe class StringExtensions
{
    public static Byte[] ToByteArray(this String s)
    {
        // Method Code
    }
}

নিম্নোক্ত সত্যের কারণে স্ট্রিংটি বাইট অ্যারে রূপান্তর করা যেতে পারে: নিট ইউনিকোডকে সমর্থন করে এবং ইউনিকোডটি ইউটিএফএস নামক বিভিন্ন পার্থক্য এনকোডিংগুলিকে মানানসই করে। তাদের বাইট প্রতিনিধিত্বের বিভিন্ন দৈর্ঘ্য রয়েছে তবে এ অর্থে সমান হয় যে যখন একটি স্ট্রিং এনকোড করা হয়, তখন এটি স্ট্রিংয়ে কোডেড করা যেতে পারে, তবে যদি স্ট্রিংটি একটি ইউটিএফের সাথে এনকোড করা থাকে এবং বিভিন্ন UTF এর অনুমানে ডিকোড করা থাকে তবে স্ক্রু করা যেতে পারে আপ।

এছাড়াও, .NET অ-ইউনিকোড এনকোডিংগুলিকে সমর্থন করে তবে এটি সাধারণ ক্ষেত্রে বৈধ নয় (ইউনিকোড কোড পয়েন্টের সীমিত সাব-সেটটি যদি প্রকৃত স্ট্রিং, যেমন ASCII তে ব্যবহৃত হয় তবেই বৈধ হবে)। অভ্যন্তরীণভাবে, .NET UTF-16 সমর্থন করে, কিন্তু স্ট্রিম উপস্থাপনায়ের জন্য, সাধারণত UTF-8 ব্যবহার করা হয়। এটি ইন্টারনেটের জন্য একটি আদর্শ-ডি-ফ্যাক্টওও।

বিস্ময়কর নয়, বাইট এবং ডেসারিয়ালাইজেশনের একটি অ্যারে স্ট্রিংয়ের সিরিয়ালাইজেশন ক্লাস দ্বারা সমর্থিত System.Text.Encoding, যা একটি বিমূর্ত শ্রেণী; তার প্রাপ্ত শ্রেণীগুলি কংক্রিট এনকোডিংগুলিকে সমর্থন করে: ASCIIEncodingএবং চারটি ইউটিএফ ( System.Text.UnicodeEncodingUTF-16 সমর্থন করে)

এই লিঙ্কটি রেফারেন্স

ব্যবহার করে বাইট একটি অ্যারে serialization জন্য System.Text.Encoding.GetBytes। বিপরীত অপারেশন ব্যবহারের জন্য System.Text.Encoding.GetChars। এই ফাংশন অক্ষরের একটি অ্যারে প্রদান করে, তাই একটি স্ট্রিং পেতে, একটি স্ট্রিং কন্সট্রাকটর ব্যবহার করুন System.String(char[])
এই পৃষ্ঠাটি উল্লেখ করুন।

উদাহরণ:

string myString = //... some string

System.Text.Encoding encoding = System.Text.Encoding.UTF8; //or some other, but prefer some UTF is Unicode is used
byte[] bytes = encoding.GetBytes(myString);

//next lines are written in response to a follow-up questions:

myString = new string(encoding.GetChars(bytes));
byte[] bytes = encoding.GetBytes(myString);
myString = new string(encoding.GetChars(bytes));
byte[] bytes = encoding.GetBytes(myString);

//how many times shall I repeat it to show there is a round-trip? :-)

মূল সমস্যাটি হল যে একটি স্ট্রিলে একটি গ্লাইফ 32 বিট (একটি চরিত্র কোডের জন্য 16 বিট) লাগে তবে একটি বাইট শুধুমাত্র 8 বিট অতিরিক্ত থাকে। এক-থেকে-এক ম্যাপিং বিদ্যমান নয় যদি না আপনি নিজের স্ট্রিংগুলিতে সীমাবদ্ধ থাকেন যা শুধুমাত্র ASCII অক্ষর ধারণ করে। System.Text.Eccoding এর বাইটে একটি স্ট্রিং মানচিত্রের অনেকগুলি উপায় রয়েছে [], আপনাকে এমন একটি বাছাই করা দরকার যা তথ্য হ্রাস এড়াতে পারে এবং এটি আপনার ক্লায়েন্ট দ্বারা ব্যবহার করা সহজ হবে যখন তাকে বাইট ম্যাপ করতে হবে [] ।

Utf8 একটি জনপ্রিয় এনকোডিং, এটি কম্প্যাক্ট এবং ক্ষতিকারক নয়।


byte[] strToByteArray(string str)
{
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    return enc.GetBytes(str);
}

bytes[] buffer = UnicodeEncoding.UTF8.GetBytes(string something); //for converting to UTF then get its bytes

bytes[] buffer = ASCIIEncoding.ASCII.GetBytes(string something); //for converting to ascii then get its bytes






character-encoding