我在C#中使用此函数将小端字节数组转换为整数:
int LE2INT(byte[] data)
{
return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0];
}
现在我想将它转换回小端.. 像
这样的东西byte[] INT2LE(int data)
{
// ...
}
有什么想法吗?
感谢。
答案 0 :(得分:20)
只需将其反转,请注意,此代码(与其他代码相同)仅适用于小型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;
}
答案 1 :(得分:20)
BitConverter
类可用于此目的,当然,它也可用于小端和大端系统。
当然,您必须跟踪数据的字节顺序。例如,对于通信,这将在您的协议中定义。
然后,您可以使用BitConverter
类将数据类型转换为字节数组,反之亦然,然后使用IsLittleEndian
标志来查看是否需要在系统上转换它
IsLittleEndian
标志会告诉您系统的 endianness ,因此您可以按如下方式使用它:
这是来自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。
希望这有助于任何人来到这里:)
答案 2 :(得分:7)
反过来做:
result[3]= (data >> 24) & 0xff;
result[2]= (data >> 16) & 0xff;
result[1]= (data >> 8) & 0xff;
result[0]= data & 0xff;
答案 3 :(得分:3)
你能使用BitConverter课吗?它只适用于我认为的小端硬件,但它应该为你处理大部分繁重的工作。
以下是一个人为的例子,说明了该课程的使用:
if(BitConverter.IsLittleEndian)
{
int someInteger = 100;
byte[] bytes = BitConverter.GetBytes(someInteger);
int convertedFromBytes = BitConverter.ToInt32(bytes, 0);
}
答案 4 :(得分:2)
BitConverter.GetBytes(1000).Reverse<byte>().ToArray();
答案 5 :(得分:0)
根据您实际执行的操作,您可以依靠让框架使用IPAddress.HostToNetworkOrder和相应的反向函数来处理字节序的详细信息。然后只需使用BitConverter类进出字节数组。
答案 6 :(得分:0)
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;
}
答案 7 :(得分:0)
You can use this if you don't want to use new heap allocations:
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);
}