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

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)

  • 为什么您的示例仅适用于小端机器?AFAIK的位移方法应该是与endian无关的. (6认同)
  • 根据ECMA-335标准,从uint到byte的转换(指令conv.i1)意味着简单地将最重要的字节归零.因此,"&0xFF"部分过度. (2认同)

MSN*_*MSN 7

只是反过来做:

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)