2010-07-26 16 views
16

मैं सोच रहा था अगर यह परीक्षण के लिए एक बड़े endian व्यवहार का अनुकरण करने के लिए, संभव है?सी में एक बड़े-अंत व्यवहार का अनुकरण/अनुकरण करें?

या तो विंडोज या लिनक्स, MinGW या जीसीसी के माध्यम से

। यहाँ कोड का एक नमूना है जो मैं अनुकरण बड़ा endian वापस जाने के लिए चाहते हैं क्या है:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <limits.h> 
#if CHAR_BIT != 8 
#error "Unsupported char size for detecting endianness" 
#endif 

int main (void) 
{ 
    short int word = 0x0001; 
    char *byte = (char *) &word; 
    if (byte[0]) printf("little endian"); 
    else printf("big endian"); 
    return 0; 
} 
+0

[बड़े-एंडियन आर्किटेक्चर वाली मशीन पर अपने कोड का परीक्षण कैसे करें?] (Http://stackoverflow.com/q/2839087/995714) –

उत्तर

19

byteorder आप परीक्षण प्रयोजनों या ऐसा कुछ के लिए endianes परिवर्तन नहीं कर सकते: जीसीसी के साथ इस -D_BSD_SOURCE

यूनिक्स, बीएसडी, और लिनक्स कोशिश पर की आवश्यकता है। आप एक बड़े एंडियन आर्किटेक्चर के लिए एक एमुलेटर स्थापित करने और एम्यूलेटर के लिए अपने प्रोग्राम को संकलित करने के लिए क्या कर सकते हैं।

http://people.debian.org/~aurel32/qemu/

QEMU के सभी प्रकार के लिए डेबियन डिस्क छवियों का समर्थन आर्किटेक्चर हैं: यहाँ के तहत एक ही रास्ता है,। मिप्स, स्पार्क और बांह बड़े-एंडियन हैं (-एल के साथ समाप्त होने वाली कुछ भी डाउनलोड न करें)। मैं एमआईपीएस के लिए डेबियन लेनी का उपयोग कर रहा हूं (http://people.debian.org/~aurel32/qemu/mips/)। अपने प्लेटफॉर्म के लिए क्यूईएमयू स्थापित करें, फिर छवि और कर्नेल फ़ाइल डाउनलोड करने के लिए एमआईपीएस-पेज पर निर्देशों का पालन करें।

अब आप अपने कंसोल से एमआईपीएस के लिए डेबियन 5 में बूट कर सकते हैं।आप के लिए आभासी मशीन लॉगिन, बन सुपर उपयोगकर्ता और (पासवर्ड "रूट" है) सी-संकलक स्थापित:

debian-mips:~# su - 
debian-mips:~# apt-get update 
debian-mips:~# apt-get install gcc 

आग ऊपर एक संपादक और अपने कार्यक्रम में प्रवेश:

debian-mips:~# pico foo.c 
debian-mips:~# gcc foo.c 
debian-mips:~# ./a.out 
big endian 
+0

आपके उत्तर के लिए धन्यवाद, मैंने वास्तव में अभी तक सेट अप नहीं किया है, लेकिन मुझे लगता है कि इसे मेरी ज़रूरतों का उत्तर देना चाहिए। –

+0

कुछ आर्किटेक्चर स्विचिंग का समर्थन करते हैं। पीपीसी '-mlittle-endian' के साथ संकलित कर सकता है, लेकिन यह उतना ही बेकार है, क्योंकि कार्यक्रम स्वयं पर खड़ा नहीं हो सकता है। – u0b34a0f6ae

0

क्यों आप रन-टाइम में अपने मंच के endianness पता लगाने के लिए चाहेगा? जब आप संकलन करने के लिए जाते हैं, तो एंडियन मोड ज्ञात होता है। आपका कोड वह करेगा जो आप उम्मीद करते हैं ... यह मानते हुए कि लक्ष्य प्लेटफॉर्म पर एक छोटा int 2 बाइट है। इस hangup से बचने के लिए, आप अंतिम बाइट को देखने से बेहतर होगा। (बाइट [sizeof (लघु पूर्णांक) - 1])

+0

यहां एक और विस्तृत आवश्यकता है: मेरे पास एक ऐसा उपयोग है जो डेटा को डेटा स्टोर करता है फ़ाइल। डेटा स्थानीय पर्यावरण की मूल उन्मूलन का सम्मान करता है। अब मैं चाहता हूं कि यह डेटा एक अलग वातावरण के तहत मान्य हो, जिसका अर्थ है कि इसे मूल पर्यावरण के संकेतक के माध्यम से स्वयं को 'समायोजित' करने की आवश्यकता है - मुझे आशा है कि मुझे समझ में आ जाए? –

+0

लेखक के आर्किटेक्चर के बावजूद, इस तरह के मामलों में सर्वोत्तम प्रथाओं, फ़ाइल प्रारूप के लिए एक ही अंतहीनता का उपयोग करें। ऐसी विधियां हैं जिनसे आप इसके लिए सहायता के लिए उपयोगी पाएंगे: htons, htonl, ntohl, ntohs। ([मेजबान | नेटवर्क] [मेजबान | नेटवर्क] [लघु | लंबा]) मूल स्थानीय अंतहीनता के बावजूद - htons एक छोटा सा ले जाएगा और इसे बड़े एंडियन में परिवर्तित कर देगा। ntohl एक बड़ा एंडियन लंबा ले जाएगा और इसे अपने स्थानीय बाइट ऑर्डर में बदल देगा। इन तरीकों से प्यार करो। वे आपके मित्र हैं। – Sniggerfardimungus

+0

कुछ फ़ाइल प्रारूप हैं जिनमें उनके शीर्षलेख में अंतहीनता शामिल है और कम से कम किसी भी अंतहीनता से अनुवाद करने में सक्षम पुस्तकालय हैं। हालांकि, यह करने के लिए काम है। – nategoose

2

तुम सच में ऐसा करने के लिए ऐसा करते हैं तो आप एक इंटेल मैक का उपयोग करें और दोनों x86 और पीपीसी के लिए निर्माण कर सकते हैं चाहते हैं। पीपीसी निष्पादन योग्य रोसेटा इम्यूलेशन के माध्यम से चलाया जाएगा और यह बड़ा एंडियन होगा, जबकि देशी x86 बिल्ड निश्चित रूप से थोड़ा अंतराल होगा।

+0

इंटेल मैक एक हार्डवेयर है? –

+0

@ डूरी: हाँ, यह एक इंटेल सीपीयू वाला मैक है (पुराने मैक के विपरीत, जिसमें आईबीएम/मोटोरोला पावरपीसी सीपीयू हैं) –

+0

कोई सॉफ्टवेयर आपको सॉफ़्टवेयर-आधारित समाधान के बारे में पता है? उदाहरण के लिए –

4

आप hton * का एक समूह (नेटवर्क के लिए मेजबान) और ntoh * (नेटवर्क की मेजबानी के लिए) अपने विभिन्न उपयोगों के सभी के बीच वहाँ में कॉल फेंक कर सकते हैं। नेटवर्क एंडियन बिग एंडियन है।

16 बिट: htons = लघु ntohs = नेटवर्क नेटवर्क से होस्ट कम की मेजबानी के लिए

32 बिट: htonl = लांग ntohl = नेटवर्क नेटवर्क से होस्ट लांग होस्ट

सच करने के लिए दोनों मेजबान मेजबान करने के लिए नेटवर्क और नेटवर्क समान हैं क्योंकि वही स्वैपिंग किसी भी तरह से होता है।

वे आम तौर पर मैक्रो के रूप में लागू किया जाता है और प्लेटफार्मों कि बड़े endian का उपयोग पर कोई-ऑप्स हो जाएगा।

#include <arpa/inet.h> 

कौन सा आम तौर पर उपलब्ध है:

वे में रहते हैं।

तुम भी <endian.h> के उपयोग के अपने पुस्तकालयों यह पूछना चाहते हैं तो बना सकता है। आदमी htons आदमी endian आदमी

+0

मैं एक "क्लीनर" समाधान की उम्मीद कर रहा था ... अनुकरण जो मैं सक्रिय रूप से भूमिका बनाने में सक्रिय नहीं हूं। (अधिक सख्त सत्यापन उद्देश्य के लिए) –

+0

'int output_32 (FILE * f, uint32_t x) {if (io_endian! = local_endian) {x = endian_swap32 (x); } वापसी fwrite (& x, sizeof (uint32_t), 1, एफ); } ' – nategoose

5

मैं बड़ा करना चाहता था बाइट ऑर्डर से संबंधित मुद्दों के लिए एक प्रोग्राम का परीक्षण करने के लिए मेरी छोटी-छोटी इंटेल मशीन पर इंडियन इम्यूलेशन। क्यूईएमयू पावरपीसी एम्यूलेटर एक अच्छा समाधान की तरह लग रहा था। मैंने इसे नीचे सेट करने के लिए चरणों को दस्तावेज किया है।

1) स्थापित QEMU।

nifty:~# aptitude update && aptitude install qemu 

2) http://sourceforge.net/projects/mac-on-linux/files/ से डाउनलोड मैक-ऑन-लिनक्स और '/ usr/share/qemu' के लिए डाउनलोड में 'video.x' फाइल कॉपी किया गया। Qemu-system-ppc को इसके बारे में शिकायत करने से रोकने के लिए यह आवश्यक था।

nifty:~# tar -xjf mol-0.9.72.1.tar.bz2 
nifty:~# cp mol-0.9.72.1/mollib/drivers/video.x /usr/share/qemu 

3) पावरपीसी के लिए डेबियन डाउनलोड किया और इसे एक क्यूईएमयू हार्ड डिस्क छवि पर स्थापित किया।

[email protected]:~/qemu$ wget --no-verbose http://cdimage.debian.org/debian-cd/5.0.4/powerpc/iso-cd/debian-504-powerpc-CD-1.iso 
2010-06-19 02:55:06 URL:http://caesar.acc.umu.se/debian-cd/5.0.4/powerpc/iso-cd/debian-504-powerpc-CD-1.iso[675569664/675569664] -> "debian-504-powerpc-CD-1.iso" [1] 
[email protected]:~/qemu$ qemu-img create powerpc.img 2G 
Formatting 'powerpc.img', fmt=raw size=2147483648 
[email protected]:~/qemu$ qemu-system-ppc -hda powerpc.img -cdrom debian-504-powerpc-CD-1.iso -boot d -m 512 

4) हार्ड डिस्क छवि के साथ QEMU PowerPC एमुलेटर बूट हुआ था।

[email protected]:~/qemu$ qemu-system-ppc -hda powerpc.img -m 512 

5) सत्यापित है कि मैं एक साधारण सी प्रोग्राम लिखकर वास्तव में एक बड़ी एंडियन प्रणाली पर था।

[email protected]:~$ cat endian.c 
#include <stdio.h> 

int main() 
{ 
    int n = 0x1; 
    printf(*((char *) &n) ? "little-endian\n" : "big-endian\n"); 
    return 0; 
} 
[email protected]:~$ gcc endian.c && ./a.out 
big-endian 
[email protected]:~$ 

यदि आप पून से चूक गए हैं, तो लिलीपुटियन मूल रूप से बड़े-अंतवासी थे।

संबंधित मुद्दे