ما هو ملف الرأس حيث تحدد مكتبة Boost نوع البيانات البدائية الخاصة بها؟
-
25-09-2019 - |
سؤال
في الآونة الأخيرة ، أحاول استخدام Boost :: Spirit :: Qi Binary Endian Parser لتحليل بعض البيانات الثنائية تعتمد على endianness من المنصة. هناك مثال بسيط ، مثل المتابعة:
باستخدام الإعلانات والمتغيرات:
using boost::spirit::qi::little_word; using boost::spirit::qi::little_dword; using boost::spirit::qi::little_qword; Boost :: uint16_t لنا ؛ Boost :: uint32_t ui ؛ Boost :: uint64_t ul ؛
الاستخدام الأساسي للمتلازمة الثنائية الصغار:
test_parser_attr("\x01\x02", little_word, us); assert(us == 0x0201);
test_parser_attr("\x01\x02\x03\x04", little_dword, ui); assert(ui == 0x04030201);
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul);
assert(ul == 0x0807060504030201LL);
test_parser("\x01\x02", little_word(0x0201));
test_parser("\x01\x02\x03\x04", little_dword(0x04030201));
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
little_qword(0x0807060504030201LL));
أنه يعمل بشكل جيد جدا. لكن أسئلتي تأتي ، لماذا نحتاج إلى استخدام بعض أنواع البيانات مثل boost::uint16_t
, boost::uint32_t
هنا؟ هل بإمكاني استخدم unsigned long
أو unsigned int
هنا؟ وإذا أردت تحليل double
أو float
نوع البيانات ، ما نوع البيانات التي يجب أن أستخدمها؟ ويرجى قل لي أين يعزز التعزيز أعلاه هذه الأنواع؟
المحلول
توجد أنواع مثل UINT16_T أو UINT32_T بحيث يمكنك إعلان متغير للحصول على عرض بت محدد. لا يمكنك القيام بذلك مع أنواع عادية مثل "Long" لأنها أحجام مختلفة في البنى و/أو التطبيقات المختلفة. عادة ما يتم اشتقاق الأنواع المذكورة أعلاه من خلال الحسابات المسبقة مما يؤدي إلى typedefs إلى النوع المحدد للتنفيذ/المعماري للحصول على هذا الحجم المحدد.
نصائح أخرى
الملف <boost/cstdint.hpp>
يحتوي على كل من boost::(u)int(8|16|32|64)_t
تعريفات. يتم توفير هذا بشكل رئيسي لأن MSVC لا يشحن مع <cstdint>
. على مجمعات C ++ التي هي أيضًا مجمعات C (مثل GCC) <boost/cstdint.hpp>
فقط الواردات <cstdint>
في مساحة الاسم التعزيز.
أنظر أيضا: stdint.h