2010-07-20 7 views
12

मैं 4 बाइट सरणी को सी # में उलझाने की कोशिश कर रहा हूं। मैं वर्तमान में इस कोड का उपयोग कर रहा हूँ:सी # बिग एंडियन उलंग 4 बाइट्स

atomSize = BitConverter.ToUInt32(buffer, 0); 

बाइट [4] इस में शामिल हैं:

0 0 0 32

हालांकि, बाइट्स बिग एन्डियन हैं। क्या इस बिग-एंडियन उलंग को लिटिल-एंडियन उलोंग में बदलने का कोई आसान तरीका है?

उत्तर

18

मेरा मानना ​​है कि जॉन स्कीट के MiscUtil लाइब्रेरी में एंडियनबिट कनवर्टर (nuget link) जो भी आप चाहते हैं वह कर सकते हैं।

तुम भी बिट्स बिट पारी आपरेशन का उपयोग कर स्वैप कर सकते हैं:

uint swapEndianness(uint x) 
{ 
    return ((x & 0x000000ff) << 24) + // First byte 
      ((x & 0x0000ff00) << 8) + // Second byte 
      ((x & 0x00ff0000) >> 8) + // Third byte 
      ((x & 0xff000000) >> 24); // Fourth byte 
} 

उपयोग:

atomSize = BitConverter.ToUInt32(buffer, 0); 
atomSize = swapEndianness(atomSize); 
+1

धन्यवाद, शायद आप मुझे दिखा सकते हैं कि आप प्रति पंक्ति क्या कर रहे हैं? यह बहुत ही अच्छा होगा, मैंने अब तक कभी भी स्थानांतरण नहीं किया है। – WesleyE

+1

@ वेस्लेई: मैंने इसे थोड़ा स्पष्ट बनाने के लिए इसे फिर से लिखा है। यह एक समय में एक बाइट को संभालता है, 8 बिट्स को मुखौटा करता है और फिर अपनी नई स्थिति में बदल जाता है। परिणाम देने के लिए चार बाइट्स को एक साथ जोड़ा जाता है। यदि आपको समझ में नहीं आता कि बिटशिपिंग क्या है, तो मैं इस प्रश्न की सिफारिश करता हूं + उत्तर: http://stackoverflow.com/questions/141525/absolute-beginners-guide-to-bit-shifting –

+1

और संचालन को हटाने के लिए तेज़ है और हर बार बाइट करने के लिए डाली। – usr

6

System.Net.IPAddress.NetworkToHostOrder(atomSize); अपने बाइट्स फ्लिप जाएगा।

+2

आवश्यक नहीं है। यदि आपका मेजबान पहले से ही बड़ा-एंडियन है, तो कोई बदलाव नहीं किया जाएगा। –

+0

कोई फर्क नहीं पड़ता, जेफ। प्वाइंट है, अगर सिस्टम पहले से ही बड़ा एंडियन है, तो बिटकॉन्टर इसे बिगइंडियन के रूप में पढ़ता होगा और वैसे भी कोई बदलाव की आवश्यकता नहीं होगी। दुर्भाग्यवश, इस फ़ंक्शन या जॉन के कन्वर्ट का उपयोग करने से कुछ गंभीर प्रदर्शन दंड हो सकते हैं , अगर आप कहते हैं कि आप एक फाइल के साथ काम कर रहे हैं जिसमें उनमें से सैकड़ों हजार हैं। अगर ऐसा है तो आपको मार्क बियर के सुझाव के साथ जाना चाहिए। तेजी से पाने का एकमात्र तरीका सीपीयू विशिष्ट कार्यों को बनाना है यानी x86 में बीएसडब्ल्यूएपी असेंबली निर्देश है जो बिट स्थानांतरण से बहुत तेज है। यह फ़ंक्शन पैकेट प्रोसेसिंग – Rahly

4

मैं Mono's DataConvert का उपयोग करने की अनुशंसा करता हूं जो स्टेरॉयड पर BitConverter जैसा है। यह आपको सीधे बड़े-एंडियन बाइट सरणी में पढ़ने की अनुमति देता है और BitConverter पर बड़े पैमाने पर सुधार करता है।

स्रोत का सीधा लिंक here है।

+0

स्रोत लिंक टूटा हुआ है – mpen

+1

फिक्स्ड सोर्स लोकेशन (ऐसा लगता है कि वे जिथब में स्थानांतरित हो गए हैं: डी) –

0
firstSingle = BitConverter.ToSingle(buffer,0); 
secondSingle = BitConverter.ToSingle(buffer,2); 

var result = BitConverter.ToUInt32(BitConverter.GetBytes(secondSingle).Concat(BitConverter.GetBytes(firstSingle).ToArray()); 
4
BitConverter.ToUInt32(buffer.Reverse().ToArray(), 0) 

नहीं?

+0

बिल्कुल नहीं, आपको वहां 'ToArray()' कॉल की आवश्यकता होगी। –

+0

बिल्कुल वही बात नहीं है, यदि आपका बफर 4 से बड़ा है, तो आपको इसके बजाय आखिरी बाइट्स बदल दिए जाएंगे। 0 के बजाय, बफर। लम्बाई -4। – Rahly

1

इस वर्ष हो सकता है लेकिन मैं हैरान कोई भी इस सरल जवाब अभी तक के साथ आया हूँ, सिर्फ एक ही लाइन ...

// buffer is 00 00 00 32 
Array.Reverse(buffer); 
// buffer is 32 00 00 00 
atomSize = BitConverter.ToUInt32(buffer, 0); 

मैं इसे उपयोग कर रहा हूँ सी # में उत्पन्न चेकसम तुलना करने के लिए (थोड़ा की आवश्यकता है -एंडियन) जावा में उत्पन्न चेकसम के साथ (बड़े-एंडियन)।

+0

वही बात नहीं है। यदि बफर 00 00 00 32 54 है, तो आपका बफर रिवर्स 54 32 00 00 00 के बाद है, इसलिए एक ToUInt32 आपको मूल्य 32 नहीं देगा। यदि आपका बफर हमेशा लंबाई 4 है तो यह ठीक काम करेगा। इसे काम करने के लिए यह विभिन्न लंबाई के लिए काम करता है, आपको रिवर्स के बाद 0 की बजाय लंबाई -4 की आवश्यकता होगी। – Rahly

+0

विषय "बी # बिग-एंडियन उलंग 4 बाइट्स" है, और यह मेरा जवाब था प्रश्न के लिए विशिष्ट, मैंने कभी नहीं कहा कि यह हर मामले के लिए एक समाधान था, लेकिन परिभाषित संख्यात्मक डेटा प्रकारों के लिए (16-बिट, 32-बिट , 64-बिट, इत्यादि) यह तब तक पर्याप्त है जब तक लक्ष्य बाइट-सरणी में बाइट्स की संख्या समान होती है। – IaguCool

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