dro*_*ath 26 c# bit-manipulation
我在C#中使用此函数将一个小端字节数组转换为整数:
int LE2INT(byte[] data)
{
return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0];
}
Run Code Online (Sandbox Code Playgroud)
现在我想把它转换回小端..有点像
byte[] INT2LE(int data)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
任何的想法?
谢谢.
Wra*_*cky 24
该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.
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到完整的文章.
希望这有助于任何人来到这里:)
Joh*_*ler 21
只需反转它,请注意,此代码(与其他代码一样)仅适用于小型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;
}
Run Code Online (Sandbox Code Playgroud)
只是反过来做:
result[3]= (data >> 24) & 0xff;
result[2]= (data >> 16) & 0xff;
result[1]= (data >> 8) & 0xff;
result[0]= data & 0xff;
Run Code Online (Sandbox Code Playgroud)