كيف يمكنني اقتطاع سلسلة أثناء التحويل إلى بايت في C#؟

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

سؤال

أرغب في وضع سلسلة في مصفوفة بايت، ولكن قد تكون السلسلة كبيرة جدًا بحيث لا يمكن احتواؤها.في الحالة التي تكون فيها كبيرة جدًا، أود أن أضع أكبر قدر ممكن من السلسلة في المصفوفة.هل هناك طريقة فعالة لمعرفة عدد الشخصيات المناسبة؟

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

المحلول

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

static string Truncate(string s, int maxLength) {
    if (Encoding.UTF8.GetByteCount(s) <= maxLength)
        return s;
    var cs = s.ToCharArray();
    int length = 0;
    int i = 0;
    while (i < cs.Length){
        int charSize = 1;
        if (i < (cs.Length - 1) && char.IsSurrogate(cs[i]))
            charSize = 2;
        int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize);
        if ((byteSize + length) <= maxLength){
            i = i + charSize;
            length += byteSize;
        }
        else
            break;
    }
    return s.Substring(0, i);
}

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

نصائح أخرى

هل يجب أن تستخدم فئة التشفير لإجراء التحويل إلى صفيف البايت بشكل صحيح؟تحتوي جميع كائنات الترميز على طريقة تجاوز GetMaxCharCount ، والتي ستمنحك "الحد الأقصى لعدد الأحرف التي تنتجها فك تشفير العدد المحدد للبايت". يجب أن تكون قادرًا على استخدام هذه القيمة لتقليص السلسلة الخاصة بك وترميزها بشكل صحيح.

الطريقة الفعالة هي العثور على مقدار البايتات (المتشائمة) التي ستحتاجها لكل حرف

Encoding.GetMaxByteCount(1);

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

public virtual int Encoding.GetBytes (
 string s,
 int charIndex,
 int charCount,
 byte[] bytes,
 int byteIndex
)

إذا كنت ترغب في استخدام استخدام ذاكرة أقل

Encoding.GetByteCount(string);

ولكن هذه طريقة أبطأ بكثير.

تحتوي فئة الترميز في .NET على طريقة تسمى GetByteCount والتي يمكن أن تأخذ في سلسلة أو حرف [].إذا قمت بتمرير حرف واحد، فسوف يخبرك بعدد البايتات المطلوبة لذلك الحرف الواحد في أي تشفير تستخدمه.

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

كوكي، الكود الخاص بك لا يفعل ما تعتقد أنه يفعله.يعد التخصيص المسبق للمخزن المؤقت للبايت في حالتك إهدارًا تامًا لأنه لن يتم استخدامه.بدلاً من ذلك، تقوم مهمتك بإسقاط الذاكرة المخصصة وإعادة تعيينها arr إشارة للإشارة إلى مخزن مؤقت آخر ل Encoding.GetBytes إرجاع مجموعة جديدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top