سؤال

أنا إرسال واستقبال البيانات الثنائية إلى/من جهاز في الحزم (64 بايت).البيانات شكل معين من أجزاء والتي تختلف مع مختلف طلب / الاستجابة.

الآن أنا تصميم مترجم البيانات الواردة.ببساطة قراءة البيانات من قبل مواقع حسنا, لكن لا تبدو باردة عندما يكون لدي عشرات استجابة مختلفة الأشكال.أنا حاليا التفكير في إنشاء بعض البنيات لهذا الغرض, ولكن أنا لا أعرف كيف سيكون الأمر مع الحشو.

ربما هناك طريقة أفضل ؟


ذات صلة:

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

المحلول

لقد فعلت هذا مرات لا تحصى من قبل:إنه سيناريو شائع جدا.هناك عدد من الأشياء التي أنا تقريبا دائما.

لا تقلق كثيرا حول يجعلها أكثر كفاءة الشيء المتاحة.

إذا نحن الرياح تنفق الكثير من الوقت التعبئة والتفريغ الحزم ، ثم نستطيع دائما تغيير ذلك إلى أن تكون أكثر كفاءة.بينما أنا لم تواجه حالة لقد كان حتى الآن لم يتم تنفيذ شبكة الموجهات!

أثناء استخدام البنيات/النقابات هو النهج الأكثر فعالية من حيث وقت التشغيل يأتي مع عدد من المضاعفات:مقنعة مترجم حزمة البنيات/النقابات مباراة الثماني بنية الحزم تحتاج العمل لتجنب المحاذاة endianness القضايا ، وعدم السلامة وبما أن هناك القليل أو لا فرصة للقيام التعقل الشيكات على تصحيح يبني.

أنا في كثير من الأحيان تصل الرياح مع الهندسة المعمارية بما في ذلك الأنواع التالية من الأمور:

  • حزمة الفئة الأساسية.أي مشترك حقول البيانات يمكن الوصول إليها (ولكن ليس للتعديل).إذا كانت البيانات لا يتم تخزينها في معبأة تنسيق ، ثم هناك وظيفة الظاهرية التي سوف تنتج معبأة في حزمة.
  • عدد العرض فئات محددة من أنواع الحزمة ، والمستمدة من نوع الحزمة.إذا نحن باستخدام التعبئة وظيفة ، ثم كل عرض فئة يجب تنفيذها.
  • أي شيء يمكن أن يستدل من نوع معين من عرض الدرجة (أيحزمة نوع معرف من البيانات المشتركة) ، يتم التعامل مع كجزء من initialisation و هو خلاف ذلك unmodifiable.
  • كل عرض فئة يمكن بناؤها من تفكيك الحزمة ، أو برشاقة تفشل إذا حزم البيانات غير صالح من أجل هذا النوع.ثم وهذا يمكن أن تكون ملفوفة في مصنع للراحة.
  • إذا لم يكن لدينا RTTI المتاحة ، يمكننا الحصول على "الفقراء-الرجل RTTI" باستخدام الحزمة id لتحديد عرض فئة كائن حقا.

في كل هذا انه ممكن (حتى لو كان فقط من أجل التصحيح يبني) للتحقق من أن كل مجال من المجالات التي هي قابلة للتعديل يتم تعيين عاقل القيمة.في حين أنه قد يبدو مثل الكثير من العمل ، فإنه يجعل من الصعب جدا أن يكون هناك invalidly تنسيق حزم ، معبأة مسبقا الحزم محتويات يمكن عسيلي خلال فحص العين باستخدام مصحح أخطاء (بما في منصة العادية-تنسيق أصلي المتغيرات).

إذا كان لدينا لتنفيذ أكثر كفاءة نظام التخزين ، التي أيضا يمكن أن تكون ملفوفة في هذا التجريد مع القليل من أداء تكلفة إضافية.

نصائح أخرى

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

كمثال:

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1 byte boundary */
typedef struct {
    unsigned int    packetID;  // identifies packet in one direction
    unsigned int    data_length;
    char            receipt_flag;  // indicates to ack packet or keep sending packet till acked
    char            data[]; // this is typically ascii string data w/ \n terminated fields but could also be binary
} tPacketBuffer ;
#pragma pack(pop)   /* restore original alignment from stack */

ثم عند تعيين:

packetBuffer.packetID = htonl(123456);

ثم عند تلقي:

packetBuffer.packetID = ntohl(packetBuffer.packetID);

وهنا بعض المناقشات من Endianness و مواءمة هيكل التعبئة

إذا كنت لا حزمة هيكل ينتهي الانحياز إلى كلمة الحدود الداخلية تخطيط هيكل حجم انها سوف تكون غير صحيحة.

من الصعب أن نقول ما هي أفضل حل هو دون معرفة شكل(s) من البيانات.هل يعتبر استخدام النقابات ؟

أنا أتفق مع Wuggy.يمكنك أيضا استخدام رمز جيل للقيام بذلك.استخدام بيانات بسيطة-تعريف ملف تعريف جميع أنواع الحزمة, ثم تشغيل البرنامج النصي الثعبان أكثر من ذلك إلى توليد النموذج هياكل serialiation/unserialization وظائف لكل واحد.

هذا هو "للخروج من مربع" الحل, ولكن أود أن اقترح أن نلقي نظرة على الثعبان بناء المكتبة.

بناء هو بيثون مكتبة تحليل وبناء البيانات هياكل (ثنائي أو النصية).فمن استنادا إلى مفهوم تعريف البيانات هياكل التعريفي الطريقة ، بدلا من قانون الإجراءات:المزيد مجمع يبني تتكون من التسلسل الهرمي من أبسط منها.انها أول مكتبة يجعل تحليل المتعة ، بدلا من المعتاد والصداع هو اليوم.

بناء قوي جدا و قوية, و مجرد قراءة البرنامج التعليمي سوف تساعدك على فهم المشكلة بشكل أفضل.صاحب البلاغ أيضا لديها خطط السيارات توليد التعليمات البرمجية C من تعريفات, لذا هو بالتأكيد يستحق كل هذا الجهد في قراءة.

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