2010-08-03 13 views
7

तो मैं uint32 को बाइट [] में परिवर्तित करने के लिए बिटकोनवर्टर.गेटबाइट्स() का उपयोग कर रहा था, लेकिन सरणी में मेरा ऑर्डर पीछे की ओर लगता है। http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (दिखाता है कि यह बाइट [] थोड़ा एंडियन लगता है)।सी # - यूट को बाइट में कनवर्ट करना []

क्या बाइट एरे को उलट करने के लिए केवल linq का उपयोग करने से बेहतर तरीका है?

+0

मुझे लगता है कि मैं कहाँ संदेह में हूँ, हालांकि बाद से BitConverter.IsLittleEndian झूठे रिटर्न है, लेकिन BitConverter.GetBytes() थोड़ा endian सरणियों देता है। –

+0

यदि यह विंडोज है, तो बिटकोनवर्टर.इस्लिटल इंडियन झूठी वापसी स्पष्ट रूप से एक बग है, क्योंकि x86 और x86-64 प्रोसेसर लिटिल एंडियन हैं। – Powerlord

उत्तर

0

तो मैं अपने भ्रम का एक बड़ा हिस्सा पता लगा इस से संबंधित है: IsLittleEndian field reports false, but it must be Little-Endian?

क्या मैं लपेटकर था कर समाप्त हो गया सभी BitConverter कॉल कि endianness specifiy के लिए एक अतिरिक्त पैरामीटर ले लिया है, तो साथ कॉल एक फ़ंक्शन जोड़ा गया है जिसे यह देखने के लिए बुलाया जाता है कि बाइट्स को सम्मानित किया जाना चाहिए या नहीं।

public static class BitEndianConverter 
{ 
    public static byte[] GetBytes(bool value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 

    public static byte[] GetBytes(char value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(double value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(float value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(int value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(long value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(short value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(uint value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(ulong value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 
    public static byte[] GetBytes(ushort value, bool littleEndian) 
    { 
     return ReverseAsNeeded(BitConverter.GetBytes(value), littleEndian); 
    } 

    private static byte[] ReverseAsNeeded(byte[] bytes, bool wantsLittleEndian) 
    { 
     if (wantsLittleEndian == BitConverter.IsLittleEndian) 
      return bytes; 
     else 
      return (byte[])bytes.Reverse().ToArray(); 
    } 
} 
5

Array.Reverse अंतहीनता को बदलने के लिए।

4

माइक्रोसॉफ्ट BitConverter के लिए प्रलेखन पृष्ठ पर GetBytes() विधि के साथ छोटे-एंडियन/बड़े-एंडियन मुद्दे पर चर्चा करता है।

2

यदि आप प्लेटफ़ॉर्म आर्किटेक्चर के बीच आगे बढ़ने जा रहे हैं तो सरणी को उलटकर एक प्लेटफ़ॉर्म पर सही हो सकता है, लेकिन पहले से ही बड़े एंडियन का उपयोग करने वाले प्लेटफॉर्म पर असफल हो सकता है।

आप IPAddress.HostToNetworkOrder फ़ंक्शंस का उपयोग करते हैं, जो सुनिश्चित करेगा कि डेटा हमेशा नेटवर्क ऑर्डर (बड़ा एंडियन) में होता है।

uint number = 234234233; 
uint bigEndian = IPAddress.HostToNetworkOrder(number); 
byte[] b = BitConverter.GetBytes(bigEndian); 
1

हमेशा बड़े एंडियन बाइट सरणी को तुरंत प्राप्त करने का एक तरीका है।

public static byte[] GetBigEndianBytes(UInt32 val, bool isLittleEndian) 
    { 
     UInt32 bigEndian = val; 
     if (isLittleEndian) 
     { 
      bigEndian = (val & 0x000000FFU) << 24 | (val & 0x0000FF00U) << 8 | 
       (val & 0x00FF0000U) >> 8 | (val & 0xFF000000U) >> 24; 
     } 
     return BitConverter.GetBytes(bigEndian); 
    } 

यह अधिभार, उपयोगी हो सकता है, हालांकि देखभाल जब विभिन्न endian-nesses साथ मशीनों के लिए काम कर लिया जाना चाहिए।

public static byte[] GetBigEndianBytes(UInt32 val) 
    { 
     return GetBigEndianBytes(val, BitConverter.IsLittleEndian); 
    } 
संबंधित मुद्दे