将小端转换为int

首先,我认为这个问题不是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)

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

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

使用内置方法:

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

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

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