2010-02-28 63 views
21

我有这个功能在C#中的小端字节数组转换为一个整数:如何将int转换为小端字节数组?

int LE2INT(byte[] data) 
{ 
    return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]; 
} 

现在我想将其转换回为小端.. 喜欢的东西

byte[] INT2LE(int data) 
{ 
    // ... 
} 

任何理念?

谢谢。

回答

17

它取反, 注意,该代码(像其他)只小端机器上。 (编辑 - 这是错误的,因为这个代码定义返回LE)

byte[] INT2LE(int data) 
    { 
    byte[] b = new byte[4]; 
    b[0] = (byte)data; 
    b[1] = (byte)(((uint)data >> 8) & 0xFF); 
    b[2] = (byte)(((uint)data >> 16) & 0xFF); 
    b[3] = (byte)(((uint)data >> 24) & 0xFF); 
    return b; 
    } 
+5

为什么会你的例子在一个小唯一的工作 - 印第安机器?AFAIK移位方法应该是endian不可知的。 – nonoitall 2010-02-28 05:02:20

+0

@John,我敢肯定你的代码可以正常工作,无论代码运行在大端还是小端架构上。在任何一种情况下,b [0]是最低的顺序字节,b [1]是次低的顺序字节,依此类推。 – 2010-02-28 05:03:46

+0

我的错误是,由于此代码返回LE而不是底层cpu的自然字节顺序,因此它将适用于所有体系结构。我将删除不正确的文字。 – 2010-02-28 06:40:29

7

只要做到这一点反向:

result[3]= (data >> 24) & 0xff; 
result[2]= (data >> 16) & 0xff; 
result[1]= (data >> 8) & 0xff; 
result[0]= data  & 0xff; 
3

你可以使用BitConverter类?它只会在我认为的小端硬件上工作,但它应该能够为您处理大部分繁重的工作。

以下是说明了如何使用类的一个人为的例子:

 if(BitConverter.IsLittleEndian) 
     { 
      int someInteger = 100; 
      byte[] bytes = BitConverter.GetBytes(someInteger); 
      int convertedFromBytes = BitConverter.ToInt32(bytes, 0); 
     } 
0

取决于你实际上在做什么,你可以依靠通过让框架处理字节序的细节为你IPAddress.HostToNetworkOrder和相应的反转功能。然后,只需使用BitConverter类去往和来自字节数组。

1
public static string decimalToHexLittleEndian(int _iValue, int _iBytes) 
    { 
     string sBigEndian = String.Format("{0:x" + (2 * _iBytes).ToString() + "}", _iValue); 
     string sLittleEndian = ""; 

     for (int i = _iBytes - 1; i >= 0; i--) 
     { 
      sLittleEndian += sBigEndian.Substring(i * 2, 2); 
     } 

     return sLittleEndian; 
    } 
15

BitConverter类可用于这个,当然,它也可以在两个小和大端系统中使用。

当然,您将不得不跟踪您的数据的排序。例如对于通信,这将在您的协议中定义。

然后,您可以使用BitConverter类将数据类型转换为字节数组,反之亦然,然后使用IsLittleEndian标志查看是否需要在系统上转换它。

IsLittleEndian标志会告诉你系统的字节序,所以你可以按如下方式使用它:

这是对BitConverter类的MSDN页面。

int value = 12345678; //your value 
    //Your value in bytes... in your system's endianness (let's say: little endian) 
    byte[] bytes = BitConverter.GetBytes(value); 
    //Then, if we need big endian for our protocol for instance, 
    //Just check if you need to convert it or not: 
    if (BitConverter.IsLittleEndian) 
    Array.Reverse(bytes); //reverse it so we get big endian. 

你可以找到完整的文章here

希望这有助于任何人来到这里:)

1
BitConverter.GetBytes(1000).Reverse<byte>().ToArray(); 
+1

你能解释一下为什么这会有所帮助吗? – 2015-03-17 15:00:43

+0

我非常肯定,这是在Big Endian机器的情况下。 – Vassilis 2016-06-22 07:45:58

0

你可以使用这个,如果你不希望使用新的堆分配:

public static void Int32ToFourBytes(Int32 number, out byte b0, out byte b1, out byte b2, out byte b3) 
{ 
    b3 = (byte)number; 
    b2 = (byte)(((uint)number >> 8) & 0xFF); 
    b1 = (byte)(((uint)number >> 16) & 0xFF); 
    b0 = (byte)(((uint)number >> 24) & 0xFF); 
}