MPACK هو تنفيذ C لتشفير ودلو المدافع لتنسيق تسلسل MessagePack. إنها:
يحتوي جوهر MPACK على قارئ وكاتب مخزن مؤقت ، وحجم على غرار الأشجار يدلل على شجرة من العقد المكتوبة ديناميكيًا. يمكن تمكين وظائف المساعدة لقراءة القيم من النوع المتوقع ، للعمل مع الملفات ، لتنمية المخازن المؤقتة أو تخصيص السلاسل تلقائيًا ، للتحقق من ترميز UTF-8 ، وأكثر من ذلك.
رمز MPACK صغير بما يكفي ليتم تضمينه مباشرة في قاعدة الشفرة الخاصة بك. ما عليك سوى تنزيل حزمة الدمج وإضافة mpack.h و mpack.c إلى مشروعك.
يدعم MPACK جميع المجمعين الحديثين ، وجميع أنظمة سطح المكتب والهواتف الذكية ، ومواقع الويب ، داخل Kernel Linux ، وحتى متحكم 8 بت مثل Arduino. يمكن تخصيص ميزات MPACK في وقت الترجمة إلى تعيين الميزات والمكونات وشيكات التصحيح التي يتم تجميعها ، وما هي التبعيات المتاحة.
تقوم API بعقدة توزيع جزء كبير من بيانات MessagePack في شجرة غير قابلة للتغيير من العقد المغطاة ديناميكيًا. يمكن استخدام سلسلة من وظائف المساعدة لاستخراج بيانات أنواع محددة من كل عقدة.
// parse a file into a node tree
mpack_tree_t tree ;
mpack_tree_init_filename ( & tree , "homepage-example.mp" , 0 );
mpack_tree_parse ( & tree );
mpack_node_t root = mpack_tree_root ( & tree );
// extract the example data on the msgpack homepage
bool compact = mpack_node_bool ( mpack_node_map_cstr ( root , "compact" ));
int schema = mpack_node_i32 ( mpack_node_map_cstr ( root , "schema" ));
// clean up and check for errors
if ( mpack_tree_destroy ( & tree ) != mpack_ok ) {
fprintf ( stderr , "An error occurred decoding the data!n" );
return ;
}لاحظ أنه لا يلزم معالجة خطأ إضافية في الكود أعلاه. إذا كان الملف مفقودًا أو تالفًا ، إذا كانت مفاتيح MAP مفقودة أو إذا لم تكن العقد في الأنواع المتوقعة ، فسيتم إرجاع العقد "لا شيء" الخاصة وقيم الخاطئة/الصفر ووضع الشجرة في حالة خطأ. هناك حاجة إلى فحص خطأ فقط قبل استخدام البيانات.
المثال أعلاه يخصص العقد تلقائيًا. يمكن توفير تجمع العقدة الثابتة إلى المحلل بدلاً من ذلك في البيئات المقيدة بالذاكرة. للحصول على أقصى قدر من الأداء والحد الأدنى من استخدام الذاكرة ، يمكن استخدام واجهة برمجة التطبيقات المتوقعة لتحليل بيانات مخطط محدد مسبقًا.
يقوم API للكتابة بتشفير البيانات المهيكلة إلى MessagePack.
// encode to memory buffer
char * data ;
size_t size ;
mpack_writer_t writer ;
mpack_writer_init_growable ( & writer , & data , & size );
// write the example on the msgpack homepage
mpack_build_map ( & writer );
mpack_write_cstr ( & writer , "compact" );
mpack_write_bool ( & writer , true);
mpack_write_cstr ( & writer , "schema" );
mpack_write_uint ( & writer , 0 );
mpack_complete_map ( & writer );
// finish writing
if ( mpack_writer_destroy ( & writer ) != mpack_ok ) {
fprintf ( stderr , "An error occurred encoding the data!n" );
return ;
}
// use the data
do_something_with_data ( data , size );
free ( data );في المثال أعلاه ، نشفر إلى مخزن مؤقت للذاكرة. يمكن للكاتب بدلاً من ذلك الكتابة إلى عازلة مُلاكة مسبقًا أو مُحسّنة المكدس (بأحجام مقدمة لأنواع مركبة) ، وتجنب الحاجة إلى تخصيص الذاكرة. يمكن أيضًا تزويد الكاتب بوظيفة تدفق (مثل ملف أو وظيفة كتابة المقبس) للاتصال عندما يكون المخزن المؤقت ممتلئًا أو عند الانتهاء من الكتابة.
في حالة حدوث أي خطأ ، يتم وضع الكاتب في حالة خطأ. سيقوم الكاتب بالإبلاغ عن خطأ في حالة كتابة الكثير من البيانات ، إذا تمت كتابة العدد الخاطئ للعناصر ، في حالة حدوث فشل التخصيص ، إذا لم يكن من الممكن مسح البيانات ، وما إلى ذلك. يتم تجاهل أي كتابة لاحقة عندما يكون الكاتب في حالة خطأ ، لذلك لا تحتاج إلى التحقق من كل كتابة للأخطاء.
يستخدم المثال أعلاه mpack_build_map() لتحديد عدد أزواج القيمة الرئيسية تلقائيًا. إذا كنت تعرف مقدمًا عدد العناصر اللازمة ، فيمكنك تمريرها إلى mpack_start_map() بدلاً من ذلك. في هذه الحالة ، سيؤكد mpack_finish_map() في وضع التصحيح أن العدد المتوقع من العناصر قد كتب بالفعل ، وهو شيء قد لا تفعله مكتبات MessagePack C/C ++ الأخرى.
MPACK غني بالميزات مع الحفاظ على أداء مرتفع للغاية وصنع رمز صغير. فيما يلي جدول ميزة قصير يقارنه مع محلات C الأخرى:
| mpack (v1.1) | msgpack-c (v3.3.0) | CMP (V19) | CWPACK (v1.3.1) | |
|---|---|---|---|---|
| لا متطلبات libc | ✓ | ✓ | ✓ | |
| كاتب الذاكرة القابل للنمو | ✓ | ✓ | ✓* | |
| ملف I/O مساعدين | ✓ | ✓ | ✓* | |
| معالجة الأخطاء الحكومية | ✓ | ✓ | ||
| محلل تدريجي | ✓ | ✓ | ✓ | |
| تيار الشجرة محلل | ✓ | ✓ | ||
| تتبع حجم المركب | ✓ | |||
| حجم المركب التلقائي | ✓ |
يتوفر جدول مقارنة للميزات الأكبر هنا والذي يتضمن أوصافًا للمدخلات المختلفة في الجدول.
يقارن جناح القياس هذا أداء MPACK بالتطبيقات الأخرى لتنسيقات التسلسل المخطط. يتفوق MPACK على جميع مكتبات JSON و MessagePack (باستثناء CWPACK) ، وفي بعض الاختبارات يكون MPACK أسرع عدة مرات من Rapidjson للحصول على بيانات مكافئة.
من الناحية المفاهيمية ، يقوم MessagePack بتخزين البيانات بشكل مشابه لـ JSON: كلاهما يتكون من قيم بسيطة مثل الأرقام والسلاسل ، وتخزينها في الخرائط والصفائف. فلماذا لا تستخدم JSON بدلاً من ذلك؟ والسبب الرئيسي هو أن JSON مصمم ليكون مقروءًا من الإنسان ، لذلك ليس فعالًا مثل تنسيق التسلسل الثنائي:
يتم تحديد أنواع المركبات مثل الأوتار والخرائط والصفائف ، لذلك لا يمكن تخصيص التخزين المناسب مقدمًا. يجب تحليل الكائن بأكمله لتحديد حجمه.
لا يتم تخزين الأوتار في ترميزها الأصلي. يجب الهروب من الشخصيات الخاصة مثل عروض الأسعار والخطوط الخلفية عند كتابتها وتحويلها مرة أخرى عند القراءة.
الأرقام غير فعالة بشكل خاص (خاصة عند تحليل عوامات الخلفية) ، مما يجعل JSON غير مناسب كتنسيق الأساسي للبيانات المنظمة التي تحتوي على الكثير من الأرقام.
البيانات الثنائية غير مدعومة من قبل JSON على الإطلاق. يجب أن تكون النقط الثنائية الصغيرة مثل الرموز والأقمشة المصغرة ترميزها أو تمريرها خارج نطاق النطاق.
القضايا المذكورة أعلاه تزيد بشكل كبير من تعقيد وحدة فك الترميز. تعتبر وحدة فك ترميز JSON ذات الميزة الكاملة كبيرة جدًا ، وتميل وحدة فك التشفير الدنيا إلى ترك ميزات مثل التغلب على السلسلة والتحليل ، بدلاً من ذلك تركها إلى المستخدم أو النظام الأساسي. يمكن أن يؤدي ذلك إلى الأخطاء الخاصة بالمنصة التي يصعب العثور عليها وعلاجها المحددة ، بالإضافة إلى إمكانات أكبر للضعف الأمني. هذا أيضًا يقلل بشكل كبير من الأداء ، مما يجعل JSON غير جذاب للاستخدام في التطبيقات مثل ألعاب الهاتف المحمول.
في حين يمكن تخفيف عدم كفاءة الفضاء في JSON جزئيًا من خلال التصوير والضغط ، لا يمكن أن يؤدي عدم الكفاءة في الأداء إلى ذلك. الأهم من ذلك ، إذا كنت تقوم بتوضيح البيانات وضغطها ، فلماذا تستخدم تنسيقًا قابل للقراءة الإنسان في المقام الأول؟
لا تقوم عملية بناء MPACK ببناء MPACK في مكتبة ؛ يتم استخدامه لبناء وتشغيل اختبارات الوحدة. لا تحتاج إلى إنشاء MPACK أو مجموعة اختبار الوحدة لاستخدام MPACK.
انظر Test/README.MD للحصول على معلومات حول كيفية اختبار MPACK.