ما هو ملف الرأس حيث تحدد مكتبة Boost نوع البيانات البدائية الخاصة بها؟

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

  •  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

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