如何将int转换为小端字节数组?

我在C#中使用此函数将小端字节数组转换为整数:

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

现在我想把它转换回小端..有点像

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

任何的想法?

谢谢。

只需反转它, 请注意,此代码(与其他代码一样)仅适用于小型Endian机器。 (编辑 – 这是错误的,因为此代码按定义返回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; } 

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. 

你可以在这里找到完整的文章。

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

只需反过来做:

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

你能使用BitConverter类吗? 它只适用于我相信的小端硬件,但它应该为你处理大部分繁重的工作。

以下是一个人为的例子,说明了该类的用法:

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

根据您实际执行的操作,您可以依靠让框架使用IPAddress.HostToNetworkOrder和相应的反向函数来处理字节序的详细信息。 然后只需使用BitConverter类进出字节数组。

  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; } 

如果您不想使用新堆分配,可以使用此方法:

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