【问题标题】:Converting little endian to int将小端转换为int
【发布时间】:2010-12-13 01:10:24
【问题描述】:

首先,我认为这个问题与 C# 无关。但也可以用于其他语言,如 C。


我现在正在尝试解析以 4 字节 little-endian 格式存储整数的文件格式。 TBH,我不知道小端格式和大端格式是如何工作的。

但我需要将它们转换为可用的 int 变量。

例如, 02 00 00 00 = 2

到目前为止,我有这段代码来转换前 2 个字节:(我使用 FileStream.Read 将原始数据存储到缓冲区变量中)

        int num = ((buffer[5] << 8) + buffer[4]);

但它只会转换前两个字节。 (示例中为 02 00,而不是 02 00 00 00)

任何形式的帮助将不胜感激:)

【问题讨论】:

    标签: c#


    【解决方案1】:
    int GetBigEndianIntegerFromByteArray(byte[] data, int startIndex) {
        return (data[startIndex] << 24)
             | (data[startIndex + 1] << 16)
             | (data[startIndex + 2] << 8)
             | data[startIndex + 3];
    }
    
    int GetLittleEndianIntegerFromByteArray(byte[] data, int startIndex) {
        return (data[startIndex + 3] << 24)
             | (data[startIndex + 2] << 16)
             | (data[startIndex + 1] << 8)
             | data[startIndex];
    }
    

    【讨论】:

    • (data[startIndex + 3] &lt;&lt; 24) | (data[startIndex + 2] &lt;&lt; 16) - 为什么会这样?
    • @alex 你是什么意思,为什么这部分工作?希望我能澄清这一点
    • @Goku 只是希望能得到更多的解释
    • @alex,举个例子怎么样:如果我们有一个 2 字节 {15, 255} 的字节数组。如果我们去 (data[0]
    【解决方案2】:

    使用内置方法:

    byte[] data = { 2, 0, 0, 0 };
    Array.Reverse(data);
    int value = BitConverter.ToInt32(data, 0);
    

    另一方面,使用优化的不安全代码:

    public static unsafe void SwapInts(int[] data) {
      int cnt = data.Length;
      fixed (int* d = data) {
        byte* p = (byte*)d;
        while (cnt-- > 0) {
          byte a = *p;
          p++;
          byte b = *p;
          *p = *(p + 1);
          p++;
          *p = b;
          p++;
          *(p - 3) = *p;
          *p = a;
          p++;
        }
      }
    }
    

    注意:您可以使用BitConverter.IsLittleEndian来检查计算机内部使用的是小端还是大端,这样您就可以使代码具有可移植性。

    【讨论】:

      【解决方案3】:

      IIRC,Jon Skeet 的 MiscUtil 库有一些处理字节序的代码。

      【讨论】:

      【解决方案4】:

      我从 little endian 到 int 的通用解决方案是这样的:

      public static int GetLittleEndianIntegerFromByteArray(byte[] data)
      {
          int length = data.Length;
          int result = 0;
      
          for (int i = length - 1; i >= 0; i--)
          {
              result |= data[i] << i * 8;
          }
          return result;
      }
      

      【讨论】:

      • 如果他们传入 data.Length > 4,你认为会发生什么? int 通常是 32 位长....
      猜你喜欢
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2017-06-19
      • 1970-01-01
      相关资源
      最近更新 更多