الحصول على منتهية سلسلة من System.Text.Encoding.Unicode.GetString

StackOverflow https://stackoverflow.com/questions/864246

سؤال

ولدي مجموعة من البايتات التي أتلقاها من كيان خارجي. هو حجم ثابت. بايت تحتوي على سلسلة الشفرة، مع 0 القيم لوحة ما تبقى من المخزن المؤقت:

وهكذا بايت قد يكون:

H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc 

وأنا الحصول على هذا المخزن وتحويله إلى سلسلة مثل ذلك:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
String cmd = System.Text.Encoding.Unicode.GetString(buffer);

وماذا أعود هو السلسلة التي يبدو مثل هذا:

"HELLO\0\0\0\0\0\0\0\0..."

وكيف يمكنني معرفة GetString لإنهاء السلسلة عند أول لاغية يونيكود (أي حتى أنا فقط نعود "مرحبا")؟

وشكرا على اي الإدخال.

هل كانت مفيدة؟

المحلول

إذا كنت على يقين والباقي هو فقط \ 0، وهذا من شأنه العمل:

cmd = cmd.TrimEnd('\0');

وإلا، إذا كنت ترغب فقط في الحصول على كل شيء قبل اغية الأول:

int index = cmd.IndexOf('\0');
if (index >= 0)
   cmd = cmd.Remove(index);

لاحظ أن Unicode.GetString سوف تأخذ الرعاية من 0S \ مزدوجة. يجب أن ننظر فقط لواحد \ 0.

نصائح أخرى

وأسهل طريقة سيكون لخفض السلسلة بعد التحويل، كما اقترح بالفعل.

إذا كنت تعرف عدد الأحرف مسبقا، يمكنك استخدام الزائد GetString أن يأخذ المؤشر بداية وعدد من وحدات البايت، من أجل الحصول على السلسلة الصحيحة، دون التشذيب.

إذا كنت لا تعرف عدد الأحرف مقدما، وأود أن تجنب تقليم سلسلة بعد ذلك، تحتاج إلى تقليم صفيف بايت لأول مرة، لذلك يمكنك تمرير فقط بايت كنت مهتما في سبيل يونيكود، فإن هذا يعني إزالة أي بايت بعد وبما في ذلك الزوج الأول من الأصفار.

وبدلا من اعادة معالجة سلسلة يمكنك الحصول على التواجد الأول بايت فارغة في المخزن المؤقت (باستخدام System.Array.IndexOf). يمكنك بعد ذلك استخدام الأسلوب System.Text.Encoding.Unicode.GetString طاقتها لخلق سلسلة يصل إلى حجم المخزن المؤقت معين.

والمثال التالي أيضا يلبي العازلة التي لا تحتوي على بايت فارغة:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top