2010-08-03 158 views
7

因此,我使用BitConverter.GetBytes()將uint32轉換爲byte [],但是我的數組中的順序似乎倒退了。 http://msdn.microsoft.com/en-us/library/1184xdy4.aspx (顯示它的字節[]似乎是小端)。C# - 將uint轉換爲byte []

是否有更好的方法來處理這個問題,而不是僅僅使用linq來反轉字節數組?

+0

我想這就是我很困惑,雖然BitConverter.IsLittleEndian返回false,但BitConverter.GetBytes()返回小端數組。 – 2010-08-03 17:07:02

+0

如果這是Windows,返回false的BitConverter.IsLittleEndian顯然是一個錯誤,因爲x86和x86-64處理器是Little Endian。 – Powerlord 2010-08-05 15:16:35

回答

0

所以我想通了,我困惑的很大一部分是與此有關:IsLittleEndian field reports false, but it must be Little-Endian?

我最終什麼事做在包裝的所有BitConverter與調用了一個額外的參數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

Microsoft在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); 
    } 

此重載才能得心應手,雖然護理必須通過機器不同尾數nesses工作時服用。

public static byte[] GetBigEndianBytes(UInt32 val) 
    { 
     return GetBigEndianBytes(val, BitConverter.IsLittleEndian); 
    }