【问题标题】:How to convert an int to a little endian byte array?如何将 int 转换为 little endian 字节数组?
【发布时间】:2010-02-28 04:38:59
【问题描述】:

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

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

现在我想将它转换回小端.. 类似的东西

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

有什么想法吗?

谢谢。

【问题讨论】:

    标签: c# bit-manipulation


    【解决方案1】:

    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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 为什么你的例子只能在 little-endian 机器上工作? AFAIK 位移方法应该与字节序无关。
      • @John,我很确定无论代码在大端还是小端架构上运行,您的代码都能正常工作。在任何一种情况下,b[0] 都是最低位字节,b[1] 是次低位字节,依此类推。
      • 我的错误,因为此代码返回 LE 而不是底层 cpu 的自然字节顺序,它适用于所有架构。我会删除不正确的文字。
      • 根据 ECMA-335 标准,从 uint 到字节的转换(指令 conv.i1)意味着简单地将最重要的字节归零。因此,“&0xFF”部分是多余的。
      【解决方案3】:

      反过来做:

      result[3]= (data >> 24) & 0xff;
      result[2]= (data >> 16) & 0xff;
      result[1]= (data >> 8)  & 0xff;
      result[0]=  data        & 0xff; 
      

      【讨论】:

        【解决方案4】:

        您可以使用BitConverter 类吗?我相信它只适用于 little-endian 硬件,但它应该可以为您处理大部分繁重的工作。

        下面是一个人为的例子,说明了类的使用:

        if (BitConverter.IsLittleEndian)
        {
            int someInteger = 100;
            byte[] bytes = BitConverter.GetBytes(someInteger);
            int convertedFromBytes = BitConverter.ToInt32(bytes, 0);
        }
        

        【讨论】:

          【解决方案5】:
          BitConverter.GetBytes(1000).Reverse<byte>().ToArray();
          

          【讨论】:

          • 您能解释一下为什么这会有所帮助吗?
          • 我很确定这是 Big Endian 机器的情况。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:
             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;
                }
            

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-11-20
                • 2018-12-09
                • 2022-06-10
                • 1970-01-01
                • 2017-08-26
                • 1970-01-01
                • 2012-04-29
                • 1970-01-01
                相关资源
                最近更新 更多