我有这个功能在C#中的小端字节数组转换为一个整数:如何将int转换为小端字节数组?
int LE2INT(byte[] data)
{
return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0];
}
现在我想将其转换回为小端.. 喜欢的东西
byte[] INT2LE(int data)
{
// ...
}
任何理念?
谢谢。
我有这个功能在C#中的小端字节数组转换为一个整数:如何将int转换为小端字节数组?
int LE2INT(byte[] data)
{
return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0];
}
现在我想将其转换回为小端.. 喜欢的东西
byte[] INT2LE(int data)
{
// ...
}
任何理念?
谢谢。
它取反,
注意,该代码(像其他)只小端机器上。
(编辑 - 这是错误的,因为这个代码定义返回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;
}
只要做到这一点反向:
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);
}
取决于你实际上在做什么,你可以依靠通过让框架处理字节序的细节为你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;
}
的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。
希望这有助于任何人来到这里:)
BitConverter.GetBytes(1000).Reverse<byte>().ToArray();
你能解释一下为什么这会有所帮助吗? – 2015-03-17 15:00:43
我非常肯定,这是在Big Endian机器的情况下。 – Vassilis 2016-06-22 07:45:58
你可以使用这个,如果你不希望使用新的堆分配:
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);
}
为什么会你的例子在一个小唯一的工作 - 印第安机器?AFAIK移位方法应该是endian不可知的。 – nonoitall 2010-02-28 05:02:20
@John,我敢肯定你的代码可以正常工作,无论代码运行在大端还是小端架构上。在任何一种情况下,b [0]是最低的顺序字节,b [1]是次低的顺序字节,依此类推。 – 2010-02-28 05:03:46
我的错误是,由于此代码返回LE而不是底层cpu的自然字节顺序,因此它将适用于所有体系结构。我将删除不正确的文字。 – 2010-02-28 06:40:29