繁体   English   中英

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

[英]How to convert an int to a little endian byte array?

我在 C# 中有这个函数可以将小端字节数组转换为整数:

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

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

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

任何的想法?

谢谢。

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.

您可以在此处找到完整的文章。

希望这可以帮助任何来到这里的人:)

只需反转它, 请注意,此代码(与其他代码一样)仅适用于小型 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;
  }

反过来做:

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<byte>().ToArray();
 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;
    }

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

如果您不想使用新的堆分配,可以使用它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM