2010-02-28 24 views
6

ठीक है, "एंडियननेस" विषय हमेशा मुझे थोड़ा उलझन में डाल रहा था, लेकिन मुझे कभी भी ऐसी किसी भी समस्या का सामना नहीं करना पड़ा जिसने मुझे बाइनरी लेखकों/पाठकों के डिफ़ॉल्ट व्यवहार के बारे में सोचने के लिए भी जरूरी था। मैं अभी सी # में एक पीएनजी डिकोडर लिख रहा हूं। पीएनजी फ़ाइल प्रारूप विनिर्देश बताता है कि सभी संख्याओं को एक बड़े एंडियन नोटेशन में संग्रहीत किया जाता है (जो मुझे बहुत स्वाभाविक लगता है)। हालांकि, जब मैंने देखा, तो मुझे आश्चर्य हुआ कि .NET का बाइनरी रीडर/राइटर थोड़ा एंडियन नोटेशन के साथ काम करता है। मुझे और भी उलझन में, यह तथ्य था कि जावा का बाइनरी आईओ एक बड़े एंडियन नोटेशन के साथ काम करता है (मैं जावा प्रोग्रामर नहीं हूं, इसलिए शायद मैं गलत हूं)। इसलिए मैंने निम्नलिखित प्रश्नों के बारे में सोचना शुरू किया:प्रोग्रामिंग भाषाओं में समाप्ति

1 - वे चीज़ें क्यों हैं? मेरा मतलब बेस क्लास लाइब्रेरी डिफ़ॉल्ट व्यवहार है। 2 - .NET के System.IO का उपयोग करते समय पसंदीदा नोटेशन चुनने का कोई तरीका क्यों नहीं है?

मैं वर्तमान में Jon Skeet'sMiscUtil का उपयोग कर रहा हूं और यह एक आकर्षण (धन्यवाद, आदमी =)) की तरह काम करता है। लेकिन बेस क्लास लाइब्रेरी में यह कार्यक्षमता देखना अच्छा होगा।

+0

बीसीएल क्या है ..? –

+0

बेस क्लास लाइब्रेरी – n535

+0

मुझे सबसे अधिक प्राकृतिक होने के लिए बड़ा एंडियन भी मिलता है। –

उत्तर

10

ऐसा इसलिए है क्योंकि कोड सबसे महत्वपूर्ण मंच पर जितना संभव हो सके चलाने के लिए है। सी #/.NET माइक्रोसॉफ्ट से है और ज्यादातर x86 प्लेटफार्मों पर चलता है। x86 थोड़ा-अंतराल है, इसलिए लाइब्रेरी को छोटे-एंडियन बनाने के लिए यह समझ में आता है। जावा सूर्य द्वारा बनाया गया है, और सूर्य SPARC बड़ा-एंडियन था, इस प्रकार जावा मानक इसके बजाय बड़े-एंडियन था।

+0

कॉम्पैक्ट और माइक्रो फ्रेमवर्क के बारे में क्या? हालांकि, मैं सहमत हूं कि यह एक कारक हो सकता है, .NET, प्रकृति थोड़े मंच-स्वतंत्र है। – n535

+2

जावा को प्लेटफॉर्म स्वतंत्र बनाने के लिए डिज़ाइन किया गया था, यही कारण है कि वे अधिक प्राकृतिक क्रम के साथ गए। ।नेट मुख्य रूप से अपने मंच स्वतंत्रता से आता है और मुख्य रूप से विंडोज प्लेटफॉर्म पर विभिन्न भाषाओं को सामान्य बनाने और कचरा संग्रह आदि जैसी नई भाषा सुविधाओं को लाने के लिए डिज़ाइन किया गया था। एमएस/इंटेल दुनिया इस तरह से मायोपिक हो जाती है और इस प्रकार अधिकांश फाइलें कि एक विंडोज प्रोग्रामर पढ़ा जाएगा थोड़ा endian हैं। इंटेल चिप्स पर लिटिल एंडियन पसंदीदा ऑर्डरिंग है। – PSpeed

+0

+1 ठीक है, यह निश्चित रूप से समझ में आता है, लेकिन अभी भी पसंद की अनुपस्थिति की व्याख्या नहीं करता है। बीसीएल में इसे एक बहुत ही कुशल तरीके से लागू करने के लिए कुछ भी लायक नहीं है। – n535

2

बीसीएल में System.BitConverter स्थैतिक वर्ग में चीजें हैं जो आपको सिस्टम उन्मूलन से निपटने की अनुमति देती हैं। परिणामस्वरूप बिटकॉन्टर में सभी विधियां अनिवार्य रूप से मंच अज्ञेयवादी हैं।

इसके अलावा, System.Net.IPAddress.NetworkToHostOrder विधि आपको बड़े से छोटे एंडियन से अंतहीनता बदलने की अनुमति देती है, और इसके विपरीत।

+0

IsLittleEndian संपत्ति को छोड़कर कुछ भी? System.Net.IPAddress.NetworkToHostOrder वास्तविक समस्या से बहुत दूर है हालांकि – n535

+0

मुझे यकीन नहीं है कि मैं आपकी समस्या को समझता हूं। मैं बाइनरी रीडर और बाइनरीवाइटर के साथ हर समय द्विआधारी फ़ाइलों को पढ़ता और लिखता हूं, और यदि बाइट ऑर्डर को जिस तरह से मैं पढ़ा या पढ़ा नहीं जाता है, तो मैं केवल बाइट्स को स्वैप करता हूं (आमतौर पर 'नेटवर्क टॉहोस्ट ऑर्डर' का उपयोग करके)। क्या बड़ी बात है? –

+0

ठीक है, कोई वास्तविक 'समस्या' नहीं है। दरअसल, आप .NET में पीएनजी के साथ काम कर सकते हैं, इसलिए मुझे लगता है कि .NET कोर डेवलपर्स को कोई समस्या नहीं है। लेकिन मैं भी चिंतित हूं कि आगे बढ़ने के बिना फ्लाई (जब पढ़ना) पर बाइट्स को सही ढंग से समझना अधिक कुशल होगा। बेशक, मेरे द्वारा इसे लागू करना इतना कठिन नहीं है, लेकिन मुझे लगता है कि ऐसी चीजें ढांचे के भीतर प्रदान की जानी चाहिए, क्योंकि वे काफी आम हैं (जो MiscUtil जैसी चीजों के अस्तित्व की व्याख्या करते हैं)। एकमात्र चीज जिसे मैं वास्तव में समझने की कोशिश कर रहा हूं, क्या कुछ गंभीर कारण हैं, क्यों हमारे पास नेट – n535

1

मैं इसे हमेशा, दोनों से निपटने के लिए जिस पर आप हैं मंच की परवाह किए बिना सक्षम किया जा रहा करने पर निर्भर करता है लगता है। Preon आपको उस जटिलता को छिपाने की कोशिश कर रहा है जो आपको घोषणात्मक रूप से (एनोटेशन का उपयोग करके) आपके इन-मेमोरी डेटा प्रतिनिधित्व और एन्कोडेड प्रतिनिधित्व के बीच मैपिंग को परिभाषित करता है।

तो अगर यह आपके डेटा संरचना का हिस्सा है:

public Image { 
    int width; 
    int height; 
} 

तो एक प्राकृतिक बड़ा endian प्रतिनिधित्व करने के लिए मानचित्रण को परिभाषित करने के रूप में आसान के रूप में होगा:

public Image { 
    @BoundNumber int width; 
    @BoundNumber int height; 
} 

हालांकि, अगर प्रतिनिधित्व थोड़ा एंडियन है, तो आप यह कर सकते हैं:

public Image { 
    @BoundNumber(byteOrder=LittleEndian) int width; 
    @BoundNumber(byteOrder=LittleEndian) int height; 
} 

दोनों मामलों में, एक बनाना इस डेटा संरचना के लिए कोडेक समान है:

Codec<Image> codec = Codecs.create(Image.class); 

मुझे पता है कि कुछ लोग .NET को भी पोर्ट करने के बारे में बात कर रहे थे।

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