كيفية تكرار عبر صفيف في C # عبر مكالمات متعددة

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

  •  22-07-2019
  •  | 
  •  

سؤال

لدينا تطبيق حيث نحتاج إلى اجتثاث تسلسل بعض البيانات من تيار واحد إلى كائنات متعددة.

وومجموعة البيانات تمثل عدد الرسائل من طول متغير معبأة معا. لا توجد رسالة ترسيم رموز في التيار.

ونحن نريد أن نفعل شيئا مثل:

void Decode(byte[] Data)  
{  
    Object0.ExtractMessage(Data);
    Object1.ExtractMessage(Data);
    Object2.ExtractMessage(Data);
    ...
}  

وحيث يعرف كل مكالمة ProcessData من أين تبدأ في المصفوفة. من الناحية المثالية كنا نفعل هذا دون المرور إشارة DataIx في.

لقيام بذلك في C ++ كنا تسليم قاب مؤشر في مجموعة، وسيكون كل وظيفة ProcessData زيادة فإنه كما هو مطلوب.

وكل فئة كائن يعرف كيف رسائلها الخاصة هي متسلسلة، ويمكن الاعتماد عليها (في C ++) لإرجاع المؤشر في بداية الرسالة التالية في تيار.

هل هناك آلية يحمل في ثناياه عوامل يمكننا استخدامها للقيام بذلك (من دون الذهاب unsafe)؟ وهذه العملية عالية التردد (~ 10kps) وخفيفة الوزن للغاية. نحن أيضا لا تريد أن تذهب نسخ أو تقليم مجموعة.

وشكرا لمساعدتكم.

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

المحلول

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

نصائح أخرى

وحسنا هذا يبدو وكأنه كنت ترغب في تيار بسيط (على سبيل المثال فقط استخدام MemoryStream كما مجمع حول صفيف بايت الخاص بك: stream = new MemoryStream (data)). مجرد التفاف صفيف بايت في تيار وكل كائن يقرأ قدر من مجرى كما انها تحتاج الى وثم تسلم النهر إلى البند التالي، وحتى له فائدة أن لا تضطر إلى تحميل كامل البايت مجموعة في وقت واحد.

وبخلاف ذلك يمكنك استخدام المؤشرات في C # بالضبط الطريقة التي فعلت في C ++ (على الرغم من مؤشرات تتطلب الكلمة غير آمنة وتثبيط هم)

وبدلا من ذلك هل يمكن أن مجرد تمرير البيانات ومتغير مؤشر وثم زيادة مؤشر (والذي هو، في الواقع، وهو نفس باستخدام مؤشر ولكن لا حاجة غير آمن).

وماذا عن التفاف البيانات في MemoryStream ومن ثم تمرير StreamReader في طريقة ExtractMessage؟

واعتقد العديد من الأشياء تتبادر إلى الذهن.

هل يمكن محاكاة عمل المؤشر عن طريق لف البايت [] في الدرجة التي حافظت أيضا على مجموعة الإزاحة. كلما كنت الوصول إلى مجموعة وسوف يمكنك الوصول إليه من خلال الطبقة، وربما عبر طريقة استرجاع، الذي عاد البايت التالي، وكذلك يتزايد متغير الإزاحة. يمكن أن تنتقل مثيل فئة بين المكالمات وظيفة ExtractMessage مختلفة.

وماذا عن استخدام C ++ / CLI؟ هذا من شأنه أن يتيح لك استخدام C / C ++ التقنيات المألوفة، وبعد أن يكون استدعاء مباشرة من C # دون إمكانية التشغيل المتداخل اللعين.

وبعد ذلك بالطبع هناك خيار غير آمنة اللعين، حيث يمكنك الحصول على C # المؤشر إلى بايت [] وأداء العمليات الحسابية المؤشر المطلوب.

هل يمكن إنشاء stream من صفيف بايت.

Stream stream = new MemoryStream(data);

وبعد ذلك يمكن أن تعمل المعالج على تيارات بدلا من ذلك.

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