2011-12-20 9 views
13

संभव डुप्लिकेट:
Detecting endianness programmatically in a C++ programमैं सी का उपयोग कर प्रोग्रामिंग के अपने पीसी के एंडियन-नेस को कैसे ढूंढ सकता हूं?

वहाँ किसी भी पुस्तकालय समारोह उपलब्ध मेरा पीसी की endian सत्ता को खोजने के लिए है?

उत्तर

47

यदि आपको ऐसा लगता है तो आपको लाइब्रेरी की आवश्यकता क्यों है? :)

int num = 1; 

if (*(char *)&num == 1) 
{ 
    printf("Little-Endian\n"); 
} 
else 
{ 
    printf("Big-Endian\n"); 
} 
+0

शायद यह समझाएं कि यह @Eric J की तरह क्यों काम करता है – bjackfly

+9

int num = 1 endianness के आधार पर 000.0001 या 100.000 के रूप में संग्रहीत किया जाएगा। (char *) और num उस int के पहले बाइट को इंगित करेंगे। अब अगर वह बाइट 1 पढ़ता है, तो इसके छोटे एंडियन अन्यथा बड़े एंडियन हैं। – hasanatkazmi

+1

@ हसनतकाज़मी आप कैसे जानते हैं कि कंप्यूटर 2 बाइट्स या 4 बाइट्स में नंबर स्टोर करेगा या नहीं? इसके अलावा, आप 7 बिट्स का उपयोग क्यों कर रहे हैं? –

5

मुझे लाइब्रेरी फ़ंक्शन से अवगत नहीं है।

आप एक पूर्णांक का पता प्राप्त कर सकते हैं, फिर उस पते को एक चरित्र सूचक के रूप में देखें और बाइट्स में डेटा लिखें जिसमें पूर्णांक शामिल है। फिर, पूर्णांक में वास्तव में क्या पढ़ें और देखें कि क्या आपको एक बड़े एंडियन या छोटे एंडियन आर्किटेक्चर के साथ परिणाम मिलते हैं।

1

ऐसा करने के लिए कोई मानक फ़ंक्शन नहीं है (जैसे सी मानक, या POSIX मानक)।

यदि आपका पीसी इंटेल चलाने वाला एक (विंडोज़-स्टाइल) पीसी है, तो यह छोटा-अंत है।

यदि आप अपनी मशीन पर बाइट ऑर्डर ढूंढना चाहते हैं, तो आप इस तकनीक के पूर्ण परिभाषित व्यवहार का उपयोग नहीं कर सकते हैं (लेकिन यह आमतौर पर काम करता है - मैंने कहीं भी नहीं सुना है कि यह काम नहीं करता है):

enum { BigEndian, LittleEndian }; 

int endianness(void) 
{ 
    union 
    { 
     int i; 
     char b[sizeof(int)]; 
    } u; 
    u.i = 0x01020304; 
    return (u.b[0] == 0x01) ? BigEndian : LittleEndian; 
} 

यह कोड 32-बिट int प्रकार (64-बिट या 16-बिट के बजाय) मानता है।

+0

क्यों नहीं 'u.i = 1; वापस यू.बी [0] == 1? लिटिल इंडियन: बिग इंडियन; '? इस तरह आपको int आकार के बारे में चिंता करने की ज़रूरत नहीं है। –

+0

@ मार्टिनबोनर: यह भी काम करेगा। –

5

उपयोग इस कोड:

union 
{ 
    uint8 c[4]; 
    uint32 i; 
} u; 

u.i = 0x01020304; 

if (0x04 == u.c[0]) 
    printf("Little endian\n"); 
else if (0x01 == u.c[0]) 
    printf("Big endian\n"); 
+0

आपको "अन्य अगर" की आवश्यकता नहीं है - "else" यदि यह थोड़ा अंतहीन नहीं है तो यह बड़ी अंतहीनता है। – Artur

+2

@ आर्टूर: हा हा हा हा! अन्य विकल्प भी हैं: पीडीपी 11 ने बड़े-एंडियन ऑर्डर में 16-बिट शब्दों का उपयोग किया ... शब्द के बाइट्स के साथ छोटे-अंत क्रम में (यह वीजा-विपरीत हो सकता है - यह थोड़ी देर पहले था)। –