将little endian转换为int

时间:2009-11-04 14:39:44

标签: c#

首先,我认为这个问题不是C#独立的。但也可以用于其他语言,如C。


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

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

例如, 02 00 00 00 = 2

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

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

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

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

4 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:4)

使用内置方法:

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检查计算机是否在内部使用小端或大端,以便您可以使代码可移植。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我从小端到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;
}