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


2189

কোনও ম্যানুয়ালি নির্দিষ্ট এনকোডিং নির্দিষ্ট না করে কীভাবে আমি একটি এনট (সি #) stringতে রূপান্তর করব byte[]?

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

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


23
প্রতিটি স্ট্রিং বাইটের অ্যারে হিসাবে ঠিক আছে? আমি কেন কেবল এই বাইটগুলি রাখতে পারি না?
অগ্নেল কুরিয়ান

135
এনকোডিং হ'ল অক্ষরগুলি বাইটগুলিতে ম্যাপ করে। উদাহরণস্বরূপ, ASCII- এ 'A' অক্ষরটি 65 নম্বরে মানচিত্রটি দেয় a অন্য কোনও এনকোডিংয়ে এটি একই নাও হতে পারে। .NET ফ্রেমওয়ার্কে গৃহীত স্ট্রিংয়ের উচ্চ স্তরের পদ্ধতির বিষয়টি এটিকে বহুলাংশে অপ্রাসঙ্গিক করে তোলে, যদিও (এই ক্ষেত্রে বাদে)।
লুকাস জোনস

20
শয়তানের উকিল খেলতে: আপনি যদি ইন-মেমরি স্ট্রিংয়ের বাইটগুলি পেতে চান (যেমন নেট তাদের ব্যবহার করে) এবং কোনওভাবে এগুলি (যেমন সিআরসি 32) ম্যানিপুলেট করতে চান এবং কখনও কখনও এটিকে মূল স্ট্রিংয়ে ডিকোড করতে চান না ... এটি আপনি কেন এনকোডিংগুলি সম্পর্কে যত্ন নেবেন বা কোনটি ব্যবহার করবেন তা আপনি কীভাবে বেছে নেবেন তা সরাসরি নয়।
গ্রেগ

78
অবাক করা কেউ এই লিঙ্কটি এখনও দেয় নি: joelonsoftware.com/articles/Unicode.html
বেভান

28
একটি চর বাইট নয় এবং একটি বাইট একটি চর নয়। একটি গৃহস্থালি উভয় হরফ একটি সারণী এবং একটি লেবেসীয় traditionতিহ্যের চাবি। একটি স্ট্রিং হল অক্ষরের ক্রম। (একটি শব্দ, অনুচ্ছেদ, বাক্য এবং শিরোনামগুলির নিজস্ব লেজিকাল traditionsতিহ্য রয়েছে যা তাদের নিজস্ব ধরণের সংজ্ঞাটি ন্যায়সঙ্গত করে - তবে আমি খনন করি))। পূর্ণসংখ্যা, ভাসমান পয়েন্ট সংখ্যা এবং অন্যান্য কিছুর মতো অক্ষরগুলি বাইটে এনকোড করা হয়। এমন একটি সময় ছিল যখন এনকোডিংটি একে একে সহজ ছিল: এএসসিআইআই। তবে, সমস্ত মানব প্রতীককে সমন্বিত করার জন্য, বাইটের 256 অনুমানগুলি অপর্যাপ্ত ছিল এবং আরও বাইটগুলি বেছে বেছে ব্যবহারের জন্য এনকোডিংগুলি তৈরি করা হয়েছিল।
জর্জ

উত্তর:


1855

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

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

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

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

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;
}

// Do NOT use on arbitrary bytes; only use on GetBytes's output on the SAME system
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);
}

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

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

স্ট্রিংটিতে অবৈধ অক্ষর রয়েছে কিনা তা বিবেচ্য নয়, কারণ আপনি এখনও ডেটা পেতে এবং যেকোনোভাবে মূল স্ট্রিংটিকে পুনর্গঠন করতে পারেন!

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

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


247
এটিকে সম্পর্কে কুৎসিতটি হ'ল এটি GetStringএবং GetBytesএকই কাজ করার জন্য একই সিস্টেমে চালিত হওয়া দরকার। সুতরাং আপনি অন্য কোথাও স্ট্রিংয়ে রূপান্তর করতে চান এমন বাইট পেতে আপনি এটি ব্যবহার করতে পারবেন না। সুতরাং আমি এমন পরিস্থিতি নিয়ে আসতে কঠিন সময় পার করছি যেখানে আমি এটি ব্যবহার করতে চাই।
কোডসইনচাউস

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

193
-1 আমি গ্যারান্টি দিচ্ছি যে কেউ (যেগুলি বাইট বনাম অক্ষর বোঝে না) তাদের স্ট্রিংকে একটি বাইট অ্যারেতে রূপান্তর করতে চায়, তারা এটি গুগল করবে এবং এই উত্তরটি পড়বে, এবং তারা ভুল কাজ করবে, কারণ প্রায় সমস্ত ক্ষেত্রেই ক্ষেত্রে, এনকোডিং IS প্রাসঙ্গিক।
আর্টব্রিস্টল

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

185
এই উত্তরটি এতগুলি স্তরে ভুল তবে সর্বাধিক কারণ এটি ঘোষণার কারণে "আপনাকে এনকোডিংয়ের বিষয়ে চিন্তা করা দরকার না!"! 2 টি পদ্ধতি, গেটবাইটস এবং গেটস্ট্রিং যতটা এনকোডিং.উনিকোড.গেটবাইটস () এবং এনকোডিং.উনিকোড.গেটস্ট্রিং () ইতিমধ্যে করছে তার পুনঃ-বাস্তবায়ন হিসাবে ততটুকু অনাবৃত। "যতক্ষণ না আপনার প্রোগ্রাম (বা অন্যান্য প্রোগ্রাম) বাইটগুলি ব্যাখ্যা করার চেষ্টা করবেন না" বিবৃতিটি মৌলিকভাবে ত্রুটিযুক্ত হিসাবে স্পষ্টভাবে বোঝায় যে তাদের অর্থ বাইটগুলি ইউনিকোড হিসাবে ব্যাখ্যা করা উচিত।
ডেভিড

1108

এটি আপনার স্ট্রিংয়ের ( এনএসসিআইআই , ইউটিএফ -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 ব্যবহার করে, তাই আপনি যদি সহজেই System.Text.Encoding.Unicode.GetBytes (...)। নেট ব্যবহার করেন তবে সঠিক বাইটগুলি পেতে চান ।

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


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

57
একটি। নেট স্ট্রিংগুলি সর্বদা ইউনিকোড হিসাবে এনকোড থাকে। সুতরাং System.Text.Encoding.Unicode.GetBytes () ব্যবহার করুন; বেটের সেটটি পেতে যে .NET অক্ষরগুলি উপস্থাপন করতে ব্যবহার করবে। তবে কেন আপনি এটি চান? আমি ইউটিএফ -8 সুপারিশ করি বিশেষত যখন বেশিরভাগ অক্ষর ওয়েস্টার্ন ল্যাটিন সেটে থাকে।
অ্যান্থনিডাব্লু জোন্স

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

11
@ জোয়েল, সিস্টেমের সাথে সাবধানতা অবলম্বন করুন e পাঠ্য.এনকোডিং.ডিফল্ট যেহেতু এটি চালিত হয় প্রতিটি মেশিনে এটি আলাদা হতে পারে। এজন্য সর্বদা একটি এনকোডিং যেমন UTF-8 নির্দিষ্ট করার পরামর্শ দেওয়া হয়।
অ্যাশ

25
আপনার (বা অন্য কেউ) আসলে জেনেরিক "বাইটের ব্লক" হিসাবে গণ্য না করে ডেটাটি ব্যাখ্যা করার ইচ্ছা না করা না থাকলে আপনার এনকোডিংগুলির দরকার নেই । সংক্ষেপণ, এনক্রিপশন ইত্যাদির মতো জিনিসগুলির জন্য, এনকোডিং সম্পর্কে চিন্তা করা অর্থহীন। এনকোডিং সম্পর্কে চিন্তা না করে এটি করার জন্য আমার উত্তর দেখুন । (আমি আপনাকে একটি এন -1 দিয়েছিলাম বলে আপনি যখন এনকোডিংগুলি করবেন না তখন আপনাকে চিন্তা করতে হবে, তবে আমি আজকে বিশেষভাবে বোঝাচ্ছি না P পি)
ব্যবহারকারী541686

285

গৃহীত উত্তর খুব, খুব জটিল। এর জন্য অন্তর্ভুক্ত। নেট ক্লাস ব্যবহার করুন:

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);

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


14
যদি স্বীকৃত উত্তর পরিবর্তিত হয়, রেকর্ড উদ্দেশ্যে, এটি বর্তমান সময় এবং তারিখে মেহরদাদের উত্তর। আশা করি ওপি এটি পুনর্বিবেচনা করবে এবং আরও ভাল সমাধান গ্রহণ করবে।
থমাস এডিং

7
নীতিগতভাবে ভাল তবে, এনকোডিংটি System.Text.Encoding.Unicodeমেহেরদাদের উত্তরের সমতুল্য হওয়া উচিত ।
Jodrell

5
প্রশ্নটি মূল উত্তর থেকে এখন পর্যন্ত বেশ কয়েকবার সম্পাদিত হয়েছে, সুতরাং, আমার উত্তরটি কিছুটা পুরানো d আমি কখনই মেহেরদাদের উত্তরের সমতুল্য এক্সেস দিতে চাইনি, তবে এটি করার একটি বুদ্ধিমান উপায় দেব। তবে, আপনি সঠিক হতে পারে। তবে মূল প্রশ্নের "স্ট্রিংটি কী বাইটস স্ট্রাইনে সংরক্ষণ করা হয়েছে তা পান" বাক্যাংশটি খুব অপ্রত্যাশিত। সঞ্চিত, কোথায়? স্মৃতিতে? ডিস্কে? স্মৃতিতে থাকলে System.Text.Encoding.Unicode.GetBytesসম্ভবত আরও সুনির্দিষ্ট হবে।
এরিক এ। ব্র্যান্ডস্টাডমোয়েন

7
@ এমিসিসো, আপনার পরামর্শটি বাগিচা, যদি না আপনি নিশ্চিত হয়ে থাকেন যে আপনার স্ট্রিংটি আপনার সিস্টেমের ডিফল্ট এনকোডিংয়ের সাথে সামঞ্জস্যপূর্ণ (আপনার সিস্টেমে ডিফল্ট লেগ্যাসি অক্ষরে অক্ষরে কেবল ASCII অক্ষর রয়েছে)। তবে কোথাও ওপি বলেছে না।
ফ্রেডেরিক

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

114
BinaryFormatter bf = new BinaryFormatter();
byte[] bytes;
MemoryStream ms = new MemoryStream();

string orig = "喂 Hello 谢谢 Thank You";
bf.Serialize(ms, orig);
ms.Seek(0, 0);
bytes = ms.ToArray();

MessageBox.Show("Original bytes Length: " + bytes.Length.ToString());

MessageBox.Show("Original string Length: " + orig.Length.ToString());

for (int i = 0; i < bytes.Length; ++i) bytes[i] ^= 168; // pseudo encrypt
for (int i = 0; i < bytes.Length; ++i) bytes[i] ^= 168; // pseudo decrypt

BinaryFormatter bfx = new BinaryFormatter();
MemoryStream msx = new MemoryStream();            
msx.Write(bytes, 0, bytes.Length);
msx.Seek(0, 0);
string sx = (string)bfx.Deserialize(msx);

MessageBox.Show("Still intact :" + sx);

MessageBox.Show("Deserialize string Length(still intact): " 
    + sx.Length.ToString());

BinaryFormatter bfy = new BinaryFormatter();
MemoryStream msy = new MemoryStream();
bfy.Serialize(msy, sx);
msy.Seek(0, 0);
byte[] bytesy = msy.ToArray();

MessageBox.Show("Deserialize bytes Length(still intact): " 
   + bytesy.Length.ToString());

2
আপনি এই সমস্ত অপারেশনের জন্য একই বাইনারি ফর্ম্যাটর উদাহরণটি ব্যবহার করতে পারেন
জোয়েল কোহোর্ন

3
খুব আকর্ষণীয়. স্পষ্টতই এটি কোনও উচ্চতর সারোগেট ইউনিকোড অক্ষর ফেলে দেবে। [বাইনারি ফর্ম্যাটটার ]

95

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

জোয়েল এর উপরে একটি পোস্ট করেছে:

পরম সর্বনিম্ন প্রতিটি সফ্টওয়্যার বিকাশকারী অবশ্যই, ইউনিকোড এবং চরিত্রের সেটগুলি সম্পর্কে ইতিবাচকভাবে অবশ্যই জানতে হবে (কোনও বাহানা নেই!)


6
"1 অক্ষরটি 1 বা আরও বেশি বাইট দ্বারা উপস্থাপন করা যেতে পারে" আমি সম্মত। আমি স্ট্রিংটি কীভাবে এনকোডিং করছে তা নির্বিশেষে tes বাইটগুলিই চাই। কেবলমাত্র একটি স্ট্রিং মেমরিতে সংরক্ষণ করা যায় বাইটগুলিতে। এমনকি অক্ষরগুলি 1 বা ততোধিক বাইট হিসাবে সংরক্ষণ করা হয়। আমি কেবল তাদের হাতে বাইট পেতে চাই।
অগ্নেল কুরিয়ান

16
আপনার (বা অন্য কেউ) আসলে জেনেরিক "বাইটের ব্লক" হিসাবে গণ্য না করে ডেটাটি ব্যাখ্যা করার ইচ্ছা না করা না থাকলে আপনার এনকোডিংগুলির দরকার নেই । সংক্ষেপণ, এনক্রিপশন ইত্যাদির মতো জিনিসগুলির জন্য, এনকোডিং সম্পর্কে চিন্তা করা অর্থহীন। এনকোডিং সম্পর্কে চিন্তা না করে এটি করার জন্য আমার উত্তর দেখুন ।
ব্যবহারকারী541686

9
@ মেহরদাদ - সম্পূর্ণ, তবে মূল প্রশ্নটি, যেমনটি আমি প্রাথমিকভাবে উত্তর দিয়েছিলাম, ঠিক তখনই বলা হয়েছিল যে ওপি সেগুলি পরিবর্তন করার পরে তাদের সাথে কী ঘটবে, তা ভবিষ্যদ্বাণী করে না এবং ভবিষ্যতের সন্ধানকারীদের কাছে এটি সম্পর্কিত তথ্য প্রাসঙ্গিক - এটি জোয়েলের উত্তরটি বেশ সুন্দরভাবে কভার করা হয়েছে - এবং আপনি নিজের উত্তরের মধ্যে বর্ণনা করেছেন: আপনি যদি নেট নেট বিশ্বের মধ্যে থাকেন এবং আপনার পদ্ধতিগুলি / থেকে রূপান্তর করতে ব্যবহার করেন তবে আপনি খুশি। এর বাইরে যাওয়ার সাথে সাথেই এনকোডিংয়ের বিষয়টি হবে।
ঝাফ - বেন ডুগুইড

একটি কোড পয়েন্ট 4 বাইট পর্যন্ত উপস্থাপন করা যেতে পারে । (একটি ইউটিএফ -32 কোড ইউনিট, একটি ইউটিএফ -16 সারোগেট জুড়ি, বা ইউটিএফ -8 এর 4 বাইট।) ইউটিএফ -8 এর জন্য 4 বাইটের বেশি যে মানগুলির প্রয়োজন হবে তা ইউনিকোডের 0x0..0x10FFFF সীমার বাইরে। ;-)
দেবসোলার

89

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

সাধারণ প্রয়োজন

প্রতিটি স্ট্রিংয়ের একটি অক্ষর সেট এবং এনকোডিং থাকে। আপনি যখন কোনও System.Stringঅবজেক্টকে একটি অ্যারেতে রূপান্তর করেন System.Byteতখনও একটি অক্ষর সেট এবং এনকোডিং থাকে। বেশিরভাগ ব্যবহারের জন্য, আপনি কী অক্ষর সেট এবং এনকোডিং আপনার প্রয়োজন তা জানেন এবং NET এটি "রূপান্তর সহ অনুলিপি করা" সহজ করে তোলে। কেবল উপযুক্ত Encodingক্লাসটি বেছে নিন ।

// using System.Text;
Encoding.UTF8.GetBytes(".NET String to byte array")

রূপান্তরটির ক্ষেত্রে কেসটি হ্যান্ডেল করার প্রয়োজন হতে পারে যেখানে লক্ষ্য অক্ষর সেট বা এনকোডিং উত্সে থাকা কোনও অক্ষরকে সমর্থন করে না। আপনার কিছু পছন্দ আছে: ব্যতিক্রম, প্রতিস্থাপন বা এড়িয়ে যাওয়া। ডিফল্ট নীতি হ'ল '?' বিকল্পযুক্ত করা।

// using System.Text;
var text = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes("You win €100")); 
                                                      // -> "You win ?100"

স্পষ্টতই, রূপান্তরগুলি অগত্যা ক্ষয়হীন নয়!

দ্রষ্টব্য: System.Stringউত্স অক্ষরের জন্য সেটটি ইউনিকোড।

কেবল বিভ্রান্তকর বিষয় হ'ল .NET একটি অক্ষর সেটটির নাম ব্যবহার করে সেই অক্ষর সেটটির একটি নির্দিষ্ট এনকোডিংয়ের নাম ব্যবহার করে। Encoding.Unicodeবলা উচিত Encoding.UTF16

এটি বেশিরভাগ ব্যবহারের জন্যই। যদি এটি আপনার প্রয়োজন হয় তবে এখানে পড়া বন্ধ করুন। এনকোডিং কী তা যদি আপনি বুঝতে না পারেন তবে মজাদার জোয়েল স্পলস্কি নিবন্ধটি দেখুন ।

নির্দিষ্ট প্রয়োজন

এখন, প্রশ্ন লেখক জিজ্ঞাসা করেছেন, "প্রতিটি স্ট্রিং বাইটের অ্যারে হিসাবে সংরক্ষণ করা হয়, তাই না? কেন আমি কেবল এই বাইটগুলি রাখতে পারি না?"

সে কোনও রূপান্তর চায় না।

থেকে C # এর বৈশিষ্ট :

সি # তে অক্ষর এবং স্ট্রিং প্রসেসিং ইউনিকোড এনকোডিং ব্যবহার করে। চর প্রকারটি একটি ইউটিএফ -16 কোড ইউনিট উপস্থাপন করে এবং স্ট্রিং টাইপটি ইউটিএফ -16 কোড ইউনিটের ক্রম উপস্থাপন করে।

সুতরাং, আমরা জানি যে আমরা যদি নাল রূপান্তর চেয়েছি (অর্থাত্ ইউটিএফ -16 থেকে ইউটিএফ -16), আমরা পছন্দসই ফলাফল পাব:

Encoding.Unicode.GetBytes(".NET String to byte array")

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

".NET String to byte array".ToCharArray()

এটি আমাদের পছন্দসই ডেটাটাইপটি পায় না তবে মেহেরদাদের উত্তর দেখায় যে কীভাবে এই চর অ্যারেটিকে ব্লককপি ব্যবহার করে বাইট অ্যারেতে রূপান্তর করা যায় । যাইহোক, এই স্ট্রিং দুইবার অনুলিপি! এবং এটি খুব স্পষ্টভাবে এনকোডিং-নির্দিষ্ট কোড ব্যবহার করে: ডেটাটাইপ System.Char

স্ট্রিংটি স্ট্রিং থাকা প্রকৃত বাইটগুলি পাওয়ার একমাত্র উপায় পয়েন্টার ব্যবহার করা। fixedবিবৃতি মূল্যবোধের ঠিকানা গ্রহণ করতে পারবেন। সি # স্পেস থেকে:

[এর জন্য] টাইপ স্ট্রিংয়ের একটি অভিব্যক্তি, ... আরম্ভকারী স্ট্রিংয়ের প্রথম অক্ষরের ঠিকানা গণনা করে।

এটি করতে, সংকলক স্ট্রিং অবজেক্টের সাথে অন্যান্য অংশের উপরে কোড স্কিপ লেখেন RuntimeHelpers.OffsetToStringData। সুতরাং, কাঁচা বাইট পেতে, কেবল স্ট্রিংয়ের জন্য একটি পয়েন্টার তৈরি করুন এবং প্রয়োজনীয় বাইটের সংখ্যাটি অনুলিপি করুন।

// using System.Runtime.InteropServices
unsafe byte[] GetRawBytes(String s)
{
    if (s == null) return null;
    var codeunitCount = s.Length;
    /* We know that String is a sequence of UTF-16 codeunits 
       and such codeunits are 2 bytes */
    var byteCount = codeunitCount * 2; 
    var bytes = new byte[byteCount];
    fixed(void* pRaw = s)
    {
        Marshal.Copy((IntPtr)pRaw, bytes, 0, byteCount);
    }
    return bytes;
}

@ কোডসইনচায়োস যেমন উল্লেখ করেছেন, ফলাফলটি মেশিনের শেষের উপর নির্ভর করে। তবে প্রশ্ন লেখক তাতে উদ্বিগ্ন নন।


3
@ জন এটি সঠিক তবে স্ট্রিংয়ের দৈর্ঘ্য ইতিমধ্যে কোড-ইউনিটগুলির সংখ্যা দেয় (কোডপয়েন্ট নয়)।
টম ব্লডজেট

1
যে ইশারা জন্য ধন্যবাদ! এমএসডিএন থেকে: " Lengthসম্পত্তি [এর String] Charএই উদাহরণে অবজেক্টের সংখ্যা প্রদান করে, ইউনিকোডের অক্ষরের সংখ্যা নয়" " আপনার উদাহরণ কোড লিখিত হিসাবে সঠিক।
জান হিটিচ

1
@ সুপের্যাট "চর প্রকারটি একটি ইউটিএফ -16 কোড ইউনিটকে উপস্থাপন করে এবং স্ট্রিং টাইপটি ইউটিএফ -16 কোড ইউনিটের অনুক্রমকে উপস্থাপন করে" "C_ সি # 5 স্পেসিফিকেশন ।_ যদিও, হ্যাঁ, এমন কোনও কিছুই নেই যা অবৈধ ইউনিকোড স্ট্রিং প্রতিরোধ করে:new String(new []{'\uD800', '\u0030'})
টম ব্লডজেট

1
@ টমব্লডজেট: মজার বিষয় হল, যদি কেউ উদাহরণস্বরূপ গ্রহণ Globalization.SortKeyকরে KeyData, প্রত্যাহার করে এবং প্রতিটি থেকে প্রাপ্ত বাইটগুলি একটি String[চরিত্র অনুসারে দুটি বাইট, এমএসবি প্রথমে ] প্যাক করে , ফলাফলযুক্তString.CompareOrdinal স্ট্রিংগুলিকে আহ্বান SortKey.Compareকরা উদাহরণগুলির উপর কল করার চেয়ে যথেষ্ট দ্রুত হবে SortKey, বা এমনকি inst memcmpদৃষ্টান্তগুলিতে ডেকে আছি। যে দেওয়া, আমি অবাক কেন KeyDataএকটি Byte[]পরিবর্তে ফিরে String?
সুপারক্যাট

1
হায়, সঠিক উত্তর, কিন্তু বছরগুলি অনেক দেরিতে, গ্রহণযোগ্য হিসাবে কখনও বেশি ভোট পাবে না। টিএল এর কারণে; ডিআর লোকেরা গ্রহণযোগ্য উত্তর শিলা মনে করবে। কপিরেনপাস্টিট এবং এটিতে ভোট দিন।
মার্টিন ক্যাপোডিসি

46

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

আমি আপনার ফলোআপ প্রশ্নটি সম্বোধন করব: কেন আপনার একটি এনকোডিং বাছাই করা দরকার? স্ট্রিং ক্লাস থেকেই আপনি কেন তা পাচ্ছেন না?

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

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

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

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

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

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

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


9
.NET- এ এমন কয়েকটি অঞ্চল রয়েছে যেখানে আপনাকে স্ট্রিংয়ের জন্য বাইট অ্যারেগুলি নিতে হবে। .NET ক্রিপট্রোগ্রাফি ক্লাসগুলির অনেকটিতে কমপিউটহ্যাশ () এর মতো পদ্ধতি রয়েছে যা বাইট অ্যারে বা স্ট্রিম গ্রহণ করে। প্রথমে কোনও স্ট্রিংকে বাইট অ্যারেতে রূপান্তর করা (এনকোডিং নির্বাচন করা) এবং তারপরে বিকল্পভাবে কোনও স্ট্রিমে মোড়ানো ছাড়া আপনার বিকল্প নেই। তবে যতক্ষণ আপনি এটির সাথে একটি এনকোডিং (অর্থাত্ ইউটিএফ 8) একটি স্টিক চয়ন করেন ততক্ষণ এ নিয়ে কোনও সমস্যা নেই।
অ্যাশ

44

মেহরাদ্রাদের উত্তরের উত্তরটি কার্যকরভাবে দেখানোর জন্য , তার পদ্ধতির অযৌক্তিক সরোগেট চরিত্রগুলিও অব্যাহত রাখতে পারে (যার মধ্যে অনেকেই আমার উত্তরের বিরুদ্ধে দাঁড় করিয়েছিল, তবে যার মধ্যে প্রত্যেকেই সমানভাবে দোষী, যেমন System.Text.Encoding.UTF8.GetBytes, System.Text.Encoding.Unicode.GetBytesএই এনকোডিং পদ্ধতিগুলি উচ্চতর সার্গেটকে ধরে রাখতে পারে না) d800উদাহরণস্বরূপ অক্ষর এবং সেগুলি কেবলমাত্র উচ্চ সারোগেট অক্ষরকে মান সহ প্রতিস্থাপন করে fffd):

using System;

class Program
{     
    static void Main(string[] args)
    {
        string t = "爱虫";            
        string s = "Test\ud800Test"; 

        byte[] dumpToBytes = GetBytes(s);
        string getItBack = GetString(dumpToBytes);

        foreach (char item in getItBack)
        {
            Console.WriteLine("{0} {1}", item, ((ushort)item).ToString("x"));
        }    
    }

    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);
    }        
}

আউটপুট:

T 54
e 65
s 73
t 74
? d800
T 54
e 65
s 73
t 74

System.Text.Encoding.UTF8.GetBytes বা System.Text.Encoding.Unicode.GetBytes এর সাহায্যে এগুলি চেষ্টা করুন , তারা কেবল উচ্চ surrogate অক্ষরকে fffd মান সহ প্রতিস্থাপন করবে

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

ডার্ন, মাইক্রোসফ্টের সবেমাত্র System.Buffer.BlockCopyতার BinaryFormatterডলার ব্যবহার করা উচিত ツ

谢谢!


3
বৈধ কোড পয়েন্ট গঠনের জন্য সারোগেটদের জোড়ায় উপস্থিত হতে হবে না? যদি এটি হয় তবে আমি বুঝতে পারি যে কেন ডেটা ম্যাঙ্গেল করা হবে।
ডিটেন্ডার্স

1
@ ডিটেন্ডার্স হ্যাঁ, এগুলিও আমার চিন্তাভাবনা, তারা জোড়ায় উপস্থিত হতে হবে, যদি আপনি ইচ্ছাকৃতভাবে স্ট্রিংয়ের উপর রাখেন এবং তাদের অকেজো তৈরি করেন তবে তাদের জোড়ায় জোড় করা উচিত un আমি জানি না যে অন্যান্য দেবগণ কেন ক্ষতি করে চলেছে যে পরিবর্তে আমাদের এনকোডিং-সচেতন পদ্ধতির ব্যবহার করা উচিত, কারণ তারা সিরিয়ালাইজেশন পদ্ধতির বিবেচনা করেছিল ( আমার উত্তর , যা 3 বছরেরও বেশি সময় ধরে একটি স্বীকৃত উত্তর ছিল) অকেজো রাখে না অক্ষর অক্ষর অক্ষর। তবে তারা এটি পরীক্ষা করে ভুলে গেছে যে তাদের এনকোডিং-সচেতন সমাধানগুলি অযৌক্তিক সারোগেট চরিত্রটিকে খুব বেশি বিড়ম্বনা করে না the
মাইকেল বুয়েন

যদি কোনও সিরিয়ালাইজেশন লাইব্রেরি থাকে যা System.Buffer.BlockCopyঅভ্যন্তরীণভাবে ব্যবহার করে তবে সমস্ত এনকোডিং-অ্যাডভোকেসি লোকদের যুক্তিগুলি কার্যকর হবে
মাইকেল বুয়েন

2
@ মিশেলবুয়েন আমার কাছে মনে হয়েছে যে মূল বিষয়টি হ'ল আপনি বড় বড় সাহসী চিঠিতে কিছু বলছেন তা বলার চেয়ে, তাদের ক্ষেত্রে এটি গুরুত্বপূর্ণ নয়। ফলস্বরূপ, আপনি এমন লোকদের উত্সাহিত করছেন যারা আপনার উত্তরটির দিকে নজর রেখে মৌলিক প্রোগ্রামিং ভুল করতে থাকে যা ভবিষ্যতে অন্যদের হতাশার কারণ করে তোলে। জোড়যুক্ত সারোগেটগুলি একটি স্ট্রিংয়ে অবৈধ। এটি কোনও চর অ্যারে নয়, সুতরাং এটি বোঝা যায় যে স্ট্রিংটিকে অন্য ফর্ম্যাটে রূপান্তরকরণের ফলে FFFDসেই চরিত্রের একটি ত্রুটি ঘটবে । আপনি যদি ম্যানুয়াল স্ট্রিং ম্যানিপুলেশন করতে চান তবে প্রস্তাবিত হিসাবে একটি চর [] ব্যবহার করুন।
ট্রিপসড

2
@ ডিটেন্ডার্স: এ System.Stringহ'ল একটি অপরিবর্তনীয় ক্রম Char; .NET সর্বদা Stringযেকোন থেকে কোনও অবজেক্ট তৈরির অনুমতি দেয় Char[]এবং এর সামগ্রীটি Char[]একই মান সহ একটি রফতানি করে , এমনকি যদি মূলটি Char[]অপ্রয়োজনীয় সারোগেট থাকে।
সুপারক্যাট

41

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

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

তাহলে এই চেষ্টা করুন System.Text.Encoding.UTF8.GetBytes("Árvíztűrő tükörfúrógép);, এবং কাঁদুন! এটা কাজ করবে, কিন্তু System.Text.Encoding.UTF8.GetBytes("Árvíztűrő tükörfúrógép").Length != System.Text.Encoding.UTF8.GetBytes("Arvizturo tukorfurogep").Lengthযখন"Árvíztűrő tükörfúrógép".Length == "Arvizturo tukorfurogep".Length
mg30rg

9
@ এমজি 30 আরজি: আপনি কেন আপনার উদাহরণটি অদ্ভুত বলে মনে করেন? অবশ্যই একটি চলক-প্রস্থের এনকোডিংয়ে সমস্ত অক্ষরের বাইট দৈর্ঘ্য একই থাকে না। এতে দোষ কী?
ভ্লাদ

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

25

ঠিক আছে, আমি সমস্ত উত্তর পড়েছি এবং সেগুলি এনকোডিং বা সিরিয়ালাইজেশন সম্পর্কে এমন একটির ব্যবহার ছিল যা আনপাইড সার্গেটগুলি ফেলে দেয়।

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

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

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);
}

বাইট অ্যারেটিকে বেস64 এ রূপান্তর করতে আপনার কাস্টম পদ্ধতিটি ব্যবহার করার পরিবর্তে আপনাকে যা করতে হবে তা হ'ল বিল্ট-ইন রূপান্তরকারী: কনভার্ট.টোবেস 64 স্ট্রিং (আরআর);
মাকোটোসান

@ মাকোটোসান আপনাকে ধন্যবাদ, তবে আমি Convert.ToBase64String(arr); বেস 64 রূপান্তরগুলির জন্য ব্যবহার করেছি byte[] (data) <-> string (serialized data to store in XML file)। কিন্তু প্রাথমিক পেতে byte[] (data)একটি দিয়ে কিছু করতে প্রয়োজন আমি Stringরয়েছে বলে বাইনারি তথ্য (এটা উপায় এমএস স্কুয়েল আমার এটা ফিরে এর)। সুতরাং উপরের ফাংশনগুলি এর জন্য String (binary data) <-> byte[] (easy accessible binary data)
Gman

23

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

কারণ "স্ট্রিংয়ের বাইটস" বলে কোনও জিনিস নেই।

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

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

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

যাইহোক, আমি দৃ strongly়ভাবে আপনাকে (এবং যে কোনও ব্যক্তির পক্ষে) প্রজ্ঞাটির এই ছোট্ট অংশটি পড়ার জন্য পরামর্শ দিচ্ছি: পরম ন্যূনতম প্রতিটি সফ্টওয়্যার বিকাশকারী অবশ্যই, ইউনিকোড এবং চরিত্রের সেটগুলি সম্পর্কে অবশ্যই ইতিবাচকভাবে জানতে হবে (কোনও বাহানা নেই!)


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

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

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

2
@ জ্ঞাফু, বাইটগুলির একটি অনুলিপি করবে।
অগ্নেল কুরিয়ান

22

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

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

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

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

5
এটি সবসময় কাজ করে না। কিছু বিশেষ অক্ষর হার্ড পদ্ধতিটি খুঁজে পেয়েছি এমন পদ্ধতি ব্যবহার করে হারিয়ে যেতে পারেন।
জেবি কিং

17

স্ট্রিং এবং বাইট অ্যারের মধ্যে রূপান্তরের জন্য আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

string s = "Hello World";

// String to Byte[]

byte[] byte1 = System.Text.Encoding.Default.GetBytes(s);

// OR

byte[] byte2 = System.Text.ASCIIEncoding.Default.GetBytes(s);

// Byte[] to string

string str = System.Text.Encoding.UTF8.GetString(byte1);

ভিপিএই একটি আমার সমস্যার সমাধান করেছে (বাইট [] ff = ASCIIEncoding.ASCII.GetBytes (বারকোডেক্সটেক্সটেক্সট);)
r.hamd

16

Span<T>সি # 7.2 এর সাথে প্রকাশের আগমনের সাথে সাথে, একটি স্ট্রিংয়ের অন্তর্নিহিত মেমোরি উপস্থাপনাটিকে একটি পরিচালিত বাইট অ্যারেতে ক্যাপচার করার জন্য ক্যানোনিকাল কৌশলটি হ'ল:

byte[] bytes = "rubbish_\u9999_string".AsSpan().AsBytes().ToArray();

এটিকে আবার রূপান্তর করা একটি অ-স্টার্টার হওয়া উচিত কারণ এর অর্থ আপনি আসলে কোনওভাবে ডেটা ব্যাখ্যা করছেন, তবে সম্পূর্ণতার জন্য:

string s;
unsafe
{
    fixed (char* f = &bytes.AsSpan().NonPortableCast<byte, char>().DangerousGetPinnableReference())
    {
        s = new string(f);
    }
}

নাম NonPortableCastএবং DangerousGetPinnableReferenceযুক্তিটি আরও বলা উচিত যে আপনার সম্ভবত এটি করা উচিত নয়।

নোট করুন যে সাথে কাজ Span<T>করার জন্য সিস্টেম ইনস্টল করা প্রয়োজন M স্মৃতি নুগেট প্যাকেজ

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


13

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

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

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 বাইট, অন্যদিকে ইউটিএফ -8 উত্তর প্রথমটির জন্য কেবল 9 বাইট, এবং দ্বিতীয়টির জন্য মাত্র 7 বাইট।

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


10

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

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


3
ইউটিএফ -8 কেবলমাত্র তখনই কমপ্যাক্ট হয় যখন আপনার অক্ষরের বেশিরভাগটি ইংরেজী (এএসসিআইআই) অক্ষর সেটগুলিতে থাকে। আপনার যদি চীনা অক্ষরগুলির দীর্ঘ স্ট্রিং থাকে, তবে ইউটিএফ -16 সেই স্ট্রিংয়ের জন্য ইউটিএফ -8 এর চেয়ে আরও কমপ্যাক্ট এনকোডিং হবে ing এটি হ'ল ইউটিএফ -8 ASCII এনকোড করতে একটি বাইট ব্যবহার করে, এবং 3 (বা সম্ভবত 4) অন্যথায়।
জোয়েল মুয়েলার

7
সত্য। তবে, আপনি যদি চীনা পাঠ্য পরিচালনা করার সাথে পরিচিত হন তবে এনকোডিং সম্পর্কে আপনি কীভাবে জানতে পারবেন না?
হ্যানস প্যাস্যান্ট

9

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

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

ফলাফল হলো:

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

ওপি বিশেষত কোনও এনকোডিং নির্দিষ্ট না করার জন্য বলে ... "একটি নির্দিষ্ট এনকোডিং ম্যানুয়ালি নির্দিষ্ট করে না দিয়ে"
ফেরদজ

8

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

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

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

Encoding.UTF8.GetBytes(text)

8
এএসসিআইআইএনকোডিং ..... দরকার নেই। কেবল এনকোডিং ব্যবহার করুন UTআউটএফ 8. গেটবাইটস (পাঠ্য) পছন্দ করা হয়।
মাকোটোসান

8

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

একটি স্ট্রিং.NET- UTF-16 কোড ইউনিটের অনুক্রম হিসাবে পাঠ্যকে উপস্থাপন করে, তাই বাইটগুলি ইতিমধ্যে ইউটিএফ -16 এ মেমোরিতে এনকোড করা আছে।

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

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

টম ব্লডজেটের উত্তর

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

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

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

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

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

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


আসলে সি # তে একটি স্ট্রিং কেবল ইউটিএফ -16 এ সীমাবদ্ধ নয়। সত্যটি হ'ল এটিতে 16-বিট কোড ইউনিটের ভেক্টর রয়েছে তবে এই 16-বিট কোড ইউনিটগুলি বৈধ ইউটিএফ -16 এর মধ্যে সীমাবদ্ধ নয়। তবে সেগুলি 16-বিট হওয়ায় এগুলি 8 বিটে রূপান্তর করতে আপনার একটি এনকোডিং (বাইট অর্ডার) প্রয়োজন need একটি স্ট্রিং তখন বাইনারি কোড (যেমন একটি বিটম্যাপ চিত্র) সহ অ-ইউনিকোড ডেটা সঞ্চয় করতে পারে। এটি কেবলমাত্র I / O এবং পাঠ্য বিন্যাসে UTF-16 হিসাবে ব্যাখ্যা করা হয় যা এ জাতীয় ব্যাখ্যা দেয়।
verdy_p

সুতরাং একটি সি # স্ট্রিংয়ে, আপনি 0xFFFF বা 0xFFFE এর মতো কোনও কোড ইউনিট নিরাপদে সংরক্ষণ করতে পারেন, এমনকি তারা ইউটিএফ -16 এ অক্ষর না থাকলেও আপনি 0xD00..0xDFFF (যেমনঃ কোনও কোড ইউনিট অনুসরণ না করে বিচ্ছিন্ন 0xD800 সঞ্চয় করতে পারেন ie ইউপিএফ -16 এ অবৈধ অবৈতনিক সারোগেটগুলি)। একই মন্তব্য জাভাস্ক্রিপ্ট / ইসিএমএসক্রিপ্ট এবং জাভাতে স্ট্রিংগুলিতে প্রযোজ্য।
verdy_p

আপনি যখন "গেটবাইটস" ব্যবহার করেন, অবশ্যই আপনি কোনও এনকোডিং নির্দিষ্ট করেন না, তবে আপনি স্ট্রিংয়ে স্থানীয়ভাবে সঞ্চিত প্রতিটি কোড ইউনিটের জন্য দুটি বাইট পেতে একটি বাইট অর্ডার গ্রহণ করেন। আপনি যখন বাইটস থেকে একটি নতুন স্ট্রিং তৈরি করেন, আপনার ইউটিএফ -8 থেকে ইউটিএফ -16 এও প্রয়োজন হয় না, আপনি একটি কনভার্টারেরও প্রয়োজন হয়, আপনি উচ্চ বাইটে অতিরিক্ত 0 সন্নিবেশ করতে পারেন, বা দুটি বাইট প্যাক করতে পারেন (এমএসবি প্রথম বা এলএসবি প্রথম ক্রমে) একই 16 বিট কোড ইউনিট। স্ট্রিংগুলি 16-বিট পূর্ণসংখ্যার অ্যারেগুলির জন্য কমপ্যাক্ট ফর্ম। "অক্ষর" এর সাথে সম্পর্ক আরও একটি সমস্যা, সি # এ তারা প্রকৃত ধরণের নয় কারণ সেগুলি এখনও স্ট্রিং হিসাবে উপস্থাপন করা হয়
verdy_p

7

ওপি-র প্রশ্নের নিকটতম পদ্ধতির নাম টম ব্লডজেট যা আসলে বস্তুতে যায় এবং বাইটগুলি বের করে। আমি নিকটতম বলি কারণ এটি স্ট্রিং অবজেক্টের প্রয়োগের উপর নির্ভর করে।

"Can't I simply get what bytes the string has been stored in?"

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

আপনি যা চান তা হ'ল প্রতিটি চরিত্রের বাইটগুলি ray এবং সেখানেই 'এনকোডিং' আসে default ডিফল্টরূপে আপনি UTF-16LE পাবেন। আপনি যদি রাউন্ড ট্রিপ ব্যতীত নিজেই বাইটগুলির বিষয়ে চিন্তা না করেন তবে আপনি 'ডিফল্ট' সহ যে কোনও এনকোডিং চয়ন করতে পারেন এবং এটি পরে আবার রূপান্তর করতে পারেন (ডিফল্ট এনকোডিংটি কী, কোড পয়েন্ট, বাগ ফিক্সগুলির মতো একই পরামিতিগুলি ধরে নিচ্ছেন) , অনুমতিপ্রাপ্ত জিনিস যেমন অযৌক্তিক সারোগেটস ইত্যাদি allowed

তবে 'এনকোডিং' যাদু ছেড়ে কেন? এনকোডিংটি কেন নির্দিষ্ট করবেন না যাতে আপনি জানতে পারেন যে আপনি কী বাইটগুলি পাচ্ছেন?

"Why is there a dependency on character encodings?"

এনকোডিং (এই প্রসঙ্গে) এর অর্থ সহজভাবে বাইটগুলি যা আপনার স্ট্রিংকে উপস্থাপন করে। স্ট্রিং অবজেক্টের বাইট নয়। আপনি চেয়েছিলেন যে বাইটগুলি স্ট্রিংটি সংরক্ষণ করা হয়েছে - এইখানেই প্রশ্নটি নির্বিকারভাবে জিজ্ঞাসা করা হয়েছিল। আপনি স্ট্রিংয়ের বাইটগুলি একটি সংক্ষিপ্ত অ্যারেতে চেয়েছিলেন যা স্ট্রিংকে উপস্থাপন করে এবং স্ট্রিং অবজেক্টে থাকা অন্যান্য বাইনারি ডেটার সমস্তটিই নয়।

যার অর্থ একটি স্ট্রিং কীভাবে সংরক্ষণ করা হয় তা অপ্রাসঙ্গিক। আপনি বাইট অ্যারেতে একটি স্ট্রিং "এনকোডড" বাইটে চান।

আমি টম ব্লগের উত্তরটি পছন্দ করি কারণ তিনি আপনাকে 'স্ট্রিং অবজেক্টের বাইটস' অভিমুখে নিয়ে গিয়েছিলেন। যদিও এটি বাস্তবায়ন নির্ভরশীল এবং তিনি অভ্যন্তরীণ স্থানে উঁকি দিচ্ছেন বলে স্ট্রিংয়ের একটি অনুলিপি পুনর্গঠন করা কঠিন হতে পারে।

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


আমি এই (মেহেরদাদের সমাধান) সম্পর্কে আমার মন পরিবর্তন করেছি - এটি স্ট্রিংয়ের বাইটগুলি পাচ্ছে না; বরং এটি স্ট্রিং থেকে তৈরি করা অক্ষরের অ্যারের বাইটগুলি পাচ্ছে। এনকোডিং নির্বিশেষে, সি # তে চর ডেটাটাইপ একটি নির্দিষ্ট আকার। এটি একটি ধারাবাহিক দৈর্ঘ্য বাইট অ্যারে উত্পাদন করতে দেয় এবং এটি বাইট অ্যারের আকারের উপর ভিত্তি করে অক্ষর অ্যারেটিকে পুনরুত্পাদন করার অনুমতি দেয়। সুতরাং যদি এনকোডিংটি ইউটিএফ -8 হয়, তবে প্রতিটি চরটি বৃহত্তম utf8 মানকে সংযুক্ত করার জন্য 6 বাইট ছিল, এটি এখনও কাজ করবে। সুতরাং প্রকৃতপক্ষে - চরিত্রের এনকোডিং কোনও বিষয় নয়।

তবে একটি রূপান্তর ব্যবহৃত হয়েছিল - প্রতিটি অক্ষর একটি নির্দিষ্ট আকারের বাক্সে (সি # 'এর অক্ষরের ধরণ) স্থাপন করা হয়। তবে যে উপস্থাপনাটি তা বিবেচ্য নয়, যা প্রযুক্তিগতভাবে ওপি-র উত্তর। সুতরাং - আপনি যেভাবেই রূপান্তর করতে চলেছেন ... কেন 'এনকোড' করবেন না?


এই অক্ষরগুলি হয় সমর্থিত নয় হল UTF-8 বা হল UTF-16 বা এমনকি হল UTF-32 দ্বারা exapmle জন্য: 񩱠& (Char) 55906& (Char) 55655। সুতরাং আপনার ভুল হতে পারে এবং কোন ধরণের এনকোডিং ব্যবহার করা হচ্ছে তা বিবেচনা না করেই মেহরদাদের উত্তরটি একটি নিরাপদ রূপান্তর।
মোজতাবা রেজাeিয়ান

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

এগুলি অবৈধ অক্ষর যা কোনও এনকোডিং রেঞ্জ দ্বারা সমর্থিত নয়। এর অর্থ এই নয় যে তারা 100% অকেজো। একটি কোড যা এনকোডিং নির্বিশেষে যে কোনও ধরণের স্ট্রিংকে তার বাইট অ্যারের সমতুল্যে রূপান্তরিত করে এটি মোটেও ভুল সমাধান নয় এবং কাঙ্ক্ষিত অনুষ্ঠানে তার নিজস্ব ব্যবহার রয়েছে।
মোজতাবা রেজাeিয়ান

1
ঠিক আছে, তাহলে আমি মনে করি আপনি সমস্যাটি বুঝতে পারছেন না। আমরা জানি এটি একটি ইউনিকোড অনুবর্তী অ্যারে - আসলে, কারণ এটি। নেট, আমরা জানি এটি ইউটিএফ -16 is সুতরাং সেই চরিত্রগুলির অস্তিত্ব থাকবে না। অভ্যন্তরীণ উপস্থাপনা পরিবর্তনের বিষয়ে আপনি আমার মন্তব্যটি পুরোপুরি পড়েন নি। স্ট্রিং একটি অবজেক্ট, কোনও এনকোডড বাইট অ্যারে নয়। সুতরাং আমি আপনার শেষ বিবৃতি সাথে একমত হতে চলেছি। আপনি কোডটি সব ইউনিকোড স্ট্রিংকে যে কোনও ইউটিএফ এনকোডিংয়ে রূপান্তর করতে চান। এটি আপনি যা চান তা সঠিকভাবে করে।
জেরার্ড ওনিল

অবজেক্টগুলি মূলত বিটের ডেটা ক্রম যা তার বর্তমান অবস্থায় কোনও বস্তুকে বর্ণনা করে। সুতরাং প্রোগ্রামিং ভাষার প্রতিটি ডেটা বাইটের অ্যারেতে রূপান্তরিত হয় (প্রতিটি বাইট 8 বিট সংজ্ঞায়িত করে) কারণ আপনার কোনও বস্তুর কিছু স্থিতিকে স্মৃতিতে রাখতে হবে। আপনি ফাইল বা মেমোরিতে বাইটের ক্রম সংরক্ষণ এবং ধরে রাখতে পারেন এবং এটি ডিস্ক থেকে পড়ার পরে এটি পূর্ণসংখ্যার, বিগিন্ট, চিত্র, আসকি স্ট্রিং, ইউটিএফ -8 স্ট্রিং, এনক্রিপ্টড স্ট্রিং বা আপনার নিজস্ব নির্ধারিত ডেটাটাইপ হিসাবে কাস্ট করতে পারেন। সুতরাং আপনি বলতে পারবেন না যে বস্তুগুলি বাইট ক্রমের চেয়ে আলাদা কিছু than
মোজতাবা রেজাe

6

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

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

3

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

[DllImport(
        "msvcrt.dll",
        EntryPoint = "memcpy",
        CallingConvention = CallingConvention.Cdecl,
        SetLastError = false)]
private static extern unsafe void* UnsafeMemoryCopy(
    void* destination,
    void* source,
    uint count);

public static byte[] GetUnderlyingBytes(string source)
{
    var length = source.Length * sizeof(char);
    var result = new byte[length];
    unsafe
    {
        fixed (char* firstSourceChar = source)
        fixed (byte* firstDestination = result)
        {
            var firstSource = (byte*)firstSourceChar;
            UnsafeMemoryCopy(
                firstDestination,
                firstSource,
                (uint)length);
        }
    }

    return result;
}

এই ফাংশনটি আপনাকে খুব দ্রুত আপনার স্ট্রিংয়ের অন্তর্নিহিত বাইটগুলির একটি অনুলিপি পাবেন। আপনার সিস্টেমে যে কোনও উপায়ে এনকোড করা হচ্ছে আপনি সেই বাইটগুলি পাবেন। এই এনকোডিংটি অবশ্যই অবশ্যই ইউটিএফ -16 এলইটি তবে এটি এমন একটি বাস্তবায়ন বিশদ যা আপনার যত্ন নেওয়া উচিত নয়।

এটা হবে আরো নিরাপদ, সহজ এবং অধিক নির্ভরযোগ্য শুধু ডাকতে ভালবাসি,

System.Text.Encoding.Unicode.GetBytes()

সমস্ত সম্ভাবনায় এটি একই ফলাফল দেবে, টাইপ করা সহজ, এবং বাইটগুলি সর্বদা একটি কল দিয়ে গোল-ট্রিপ করবে

System.Text.Encoding.Unicode.GetString()

3

এখানে আমার অনিরাপদ বাস্তবায়ন 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;
}

এটি স্বীকৃত আনসারের চেয়ে বেশ দ্রুততর, এমনকি এটি মার্জিত না হলেও। এখানে আমার স্টপওয়াচ বেঞ্চমার্কগুলি 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
    }
}

RuntimeHelpers.OffsetToStringData.NET এর Itanium সংস্করণে 8 এর একাধিকের মান ? কারণ অন্যথায় স্বাক্ষরবিহীন পাঠগুলির কারণে এটি ব্যর্থ হবে।
জন হান্না

অনুরোধ করা সহজ হবে না memcpy? stackoverflow.com/a/27124232/659190
Jodrell

2

কেবল এটি ব্যবহার করুন:

byte[] myByte= System.Text.ASCIIEncoding.Default.GetBytes(myString);

2
... এবং 127 এরও বেশি লাফিয়ে লাফিয়ে সমস্ত অক্ষর হারিয়ে ফেলুন my তথ্য হারিয়ে যা System.Text.ASCIIEncoding.Default.GetBytes("Árvíztűrő tükörfúrógép.").ToString();ফিরে পাওয়া "Árvizturo tukörfurogép."যাবে না ফিরে আসবে । (এবং আমি এখনও এশিয়ান ভাষাগুলির উল্লেখ করিনি যেখানে আপনি সমস্ত অক্ষরটি আলগা করবেন))
এমজি 30 আরজি

2

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

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

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

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

বাইট ব্যবহার করে একটি অ্যারে সিরিয়ালাইজেশনের জন্য 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? :-)

2

এটি নির্ভর করে আপনি কীসের জন্য বাইট চান on

এটি কারণ, যেমন টাইলার যথাযথভাবে বলেছিলেন , "স্ট্রিংগুলি খাঁটি তথ্য নয় They তাদের কাছে তথ্যও রয়েছে " " এই ক্ষেত্রে, তথ্যটি একটি এনকোডিং যা স্ট্রিংটি তৈরি করার সময় ধরে নেওয়া হয়েছিল।

ধরে নিচ্ছি যে আপনার কাছে স্ট্রিনে বাইনারি ডেটা (পাঠ্যের পরিবর্তে) সঞ্চিত রয়েছে

এটি তার নিজের প্রশ্নের ওপির মন্তব্যের ভিত্তিতে তৈরি এবং আমি যদি ব্যবহারের ক্ষেত্রে ওপির ইঙ্গিতগুলি বুঝতে পারি তবে এটি সঠিক প্রশ্ন।

স্ট্রিংগুলিতে বাইনারি ডেটা সংরক্ষণ করা সম্ভবত ভুল পদ্ধতির কারণ উপরে বর্ণিত ধরে নেওয়া এনকোডিংয়ের! যে প্রোগ্রাম বা লাইব্রেরিতে যে বাইনারি ডেটা সংরক্ষণ করা হয়েছিল string( যে byte[]বিন্যাসের চেয়ে আরও উপযুক্ত হবে তার পরিবর্তে ) এটি শুরু হওয়ার আগেই যুদ্ধটি হেরে গেছে lost যদি তারা আপনার কাছে কোনও বিশ্রামের অনুরোধ / প্রতিক্রিয়া বা এমন কিছুতে বাইটগুলি প্রেরণ করে যা অবশ্যই স্ট্রিং প্রেরণ করতে পারে তবে বেস 64 সঠিক পদ্ধতির হবে।

আপনার যদি অজানা এনকোডিং সহ একটি পাঠ্য স্ট্রিং থাকে

অন্য প্রত্যেকে এই ভুল প্রশ্নের উত্তর দিয়েছে।

স্ট্রিংটি যেমনটি দেখতে ভাল লাগে, কেবল একটি এনকোডিং বাছাই করুন (পছন্দমতো একটি ইউটিএফ দিয়ে শুরু করা), সংশ্লিষ্ট System.Text.Encoding.???.GetBytes()ফাংশনটি ব্যবহার করুন এবং আপনি যে এনকোডিংটি বেছে নিয়েছেন তাতে আপনি যে বাইট দিবেন তা বলুন।


2

বাইটগুলি নিয়ে আপনার কী করার ইচ্ছা জানতে চাইলে আপনি প্রতিক্রিয়া জানিয়েছিলেন :

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

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

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

যোগাযোগের জন্য (হয় সম্পূর্ণ আলাদাভাবে প্রক্রিয়া সহ বা ভবিষ্যতে একই প্রোগ্রামের সাথে), আপনার প্রোটোকলটি এর সাথে কাজ করার অসুবিধা হ্রাস করতে বা ঘটনাক্রমে বাগ তৈরির জন্য কঠোরভাবে সংজ্ঞা দিতে হবে। .NET এর অভ্যন্তরীণ উপস্থাপনার উপর নির্ভর করে কোনও কঠোর, পরিষ্কার বা সামঞ্জস্যপূর্ণ সংজ্ঞা হওয়ার গ্যারান্টিযুক্ত নয়। একটি আদর্শ এনকোডিং হয় কঠোর সংজ্ঞা যে ভবিষ্যতে আপনার খেলাফ করেন না।

অন্য কথায়, আপনি কোনও এনকোডিং নির্দিষ্ট না করে ধারাবাহিকতার জন্য আপনার প্রয়োজনীয়তা পূরণ করতে পারবেন না ।

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

সুতরাং একটি এনকোডিং চয়ন করুন এবং এটি ব্যবহার করুন:

using System.Text;

// ...

Encoding.Unicode.GetBytes("abc"); # UTF-16 little endian
Encoding.UTF8.GetBytes("abc")

যেমন আপনি দেখতে পাচ্ছেন, এটি কেবল আপনার নিজের পাঠক / লেখক পদ্ধতি প্রয়োগের চেয়ে কেবল এনকোডিং অবজেক্টগুলিতে অন্তর্নির্মিত ব্যবহারের জন্য কম কোডও নয়।


1

দুটি উপায়:

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;
}

আমি নীচের অংশটি শীর্ষের চেয়ে আরও একবার ব্যবহার করি, গতির জন্য এগুলিকে চিহ্নিত করে নি।


4
মাল্টিবাইট চরিত্রগুলি সম্পর্কে কী?
অগ্নেল কুরিয়ান

সি টোবাইট () ব্যক্তিগত: এস
খোডোর

@ অ্যাগনেলকুরিয়ান এমএসডিএন বলেছে "এই পদ্ধতিটি স্বাক্ষরবিহীন বাইট মানটি প্রদান করে যা এতে প্রদত্ত চার অবজেক্টের সংখ্যাসূচক কোডটি উপস্থাপন করে। এনট ফ্রেমওয়ার্কে একটি চার অবজেক্ট একটি 16-বিট মান হয়। এর অর্থ এই পদ্ধতিটি ফিরে আসার জন্য উপযুক্ত ASCII অক্ষর পরিসর বা ইউনিকোড C0 নিয়ন্ত্রণ এবং বেসিক লাতিন এবং C1 নিয়ন্ত্রণ এবং ল্যাটিন -1 পরিপূরক পরিসীমা, U +0000 থেকে U + 00FF পর্যন্ত অক্ষরের সংখ্যার কোডগুলি। "
mg30rg

1
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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.