2012-10-18 13 views
5

के लिए बिग एंडियन और लिटिल एंडियन समर्थन हमें 3 हार्डवेयर प्लेटफ़ॉर्म - विंडोज (थोड़ा एंडियन) और लिनक्स एंबेडेड (बड़ा और छोटा एंडियन) का समर्थन करने की आवश्यकता है। हमारी डेटा स्ट्रीम उस मशीन पर निर्भर है जो इसका उपयोग करती है और डेटा को बिट फ़ील्ड में टूटा जाना आवश्यक है।बाइट एंडिंग

मैं विवरण को दूर करने के लिए एक एकल मैक्रो (यदि संभव हो) लिखना चाहता हूं। लिनक्स पर मैं लिटिल एंडियन रूपांतरणों के लिए bswap_16/bswap_32/bswap_64 का उपयोग कर सकता हूं।

हालांकि, मुझे यह मेरे विजुअल सी ++ में नहीं मिल रहा है।

क्या दोनों प्लेटफार्मों (विंडोज़ और लिनक्स) के लिए एक सामान्य अंतर्निहित है?

यदि नहीं, तो मैं बाइट स्वैपिंग करने के लिए विजुअल सी ++ में क्या उपयोग कर सकता हूं (इसे स्वयं लिखने के अलावा - कुछ मशीन ऑप्टिमाइज़ किए गए ऑप्टिमाइज़ की उम्मीद है)?

धन्यवाद।

उत्तर

12

दोनों प्लेटफार्मों आप

short के लिए (16bit) है पर: htons() और ntohs()

long के लिए

(32 बिट): htonl() और ntohl()

लापता htonll() और ntohll()long long (64 बिट) के लिए कर सकता है उन दोनों से आसानी से निर्माण किया जा सकता है। this implementation for example देखें।

अद्यतन -0:

उदाहरण साइमन रिक्टर ऊपर लिंक के लिए एक टिप्पणी में उल्लेख है, यह जरूरी काम करने के लिए है न कि। इसका कारण यह है कि: कंपाइलर यूनियनों में कहीं भी अतिरिक्त बाइट्स पेश कर सकता है। इस के आसपास काम करने के लिए संघों को पैक करने की जरूरत है। उत्तरार्द्ध प्रदर्शन हानि का कारण बन सकता है। https://stackoverflow.com/a/955980/694576

अद्यतन-0.1:

bames53 की टिप्पणी से मैं 1 उदाहरण ऊपर लिंक समाप्त करने के लिए करते हैं नहीं किया जाएगा

तो यहाँ एक और असफल-सुरक्षित दृष्टिकोण *ll कार्यों के निर्माण के लिए है सी ++ के साथ, लेकिन केवल सी के साथ।

अद्यतन-1:

लिनक्स this approach might be the ' best' पर *ll कार्यों के functionallity प्राप्त करने के लिए।

+0

वे कार्य किसी भी ओएस के लिए अपेक्षाकृत सार्वभौमिक हैं जो नेटवर्क (यानी इंटरनेट) को समझते हैं। कुछ सबसे आधुनिक ओएस। –

+0

ध्यान दें कि 'यूनियन' का उपयोग करके उनके उदाहरण कार्यान्वयन को काम करने की गारंटी नहीं है। –

+0

हां, आप सही हैं संघों को पैक किया जाना चाहिए। इस पर ध्यान दिलाने के लिए धन्यवाद। कृपया मेरे उत्तर में अपडेट देखें। @SimonRichter – alk

2

समान नाम नहीं, लेकिन समान कार्यक्षमता exist है।

2

htons और htonl (और समान मैक्रोज़) अच्छे हैं यदि आप बाइट सेक्स से निपटने का आग्रह करते हैं।

हालांकि, एएससीआईआई या इसी तरह के अपने डेटा को आउटपुट करके इस मुद्दे को दूर करने के लिए बेहतर है। इसमें थोड़ा और कमरा लगता है, और यह नेट पर थोड़ी अधिक धीरे-धीरे फैलता है, लेकिन सादगी और भविष्यरोधक इसके लायक है।

एक और विकल्प संख्यात्मक रूप से अपने int और short को अलग करना है।तो आप & 0xff और 256 बार बार विभाजित करें। यह सभी आर्किटेक्चर पर एक प्रारूप देता है। लेकिन एएससीआईआई के पास अभी भी बढ़त है क्योंकि इसे डीबग करना आसान है।

+0

ऐसा करना अच्छा लगेगा, लेकिन हम ट्रांसमिशन को नियंत्रित नहीं करते हैं। यह एक विशेष हार्डवेयर डिवाइस से डेटा पढ़ा जाता है, और वहां से बाइट को संभालने की आवश्यकता होती है। – user626201