2009-11-04 89 views
3

首先,我认为这个问题不是C#独立的。但也可以在其他语言中使用的像C.将小端转换为int


现在我试图解析存储在整数4个字节的小尾数格式的文件格式。 TBH,我不知道小端格式和大端格式是如何工作的。

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

例如, 02 00 00 00 = 2

到目前为止,我有这样的代码转换的前2个字节:(I用于FileStream.Read将原始DATAS存储到缓冲器变量)

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

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

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

回答

14
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]; 
} 
+0

'(数据[了startIndex + 3] << 24)| (data [startIndex + 2] << 16)' - 为什么这个工作? – alex 2016-07-03 20:02:16

2

IIRC,乔恩斯基特的MiscUtil库中有处理字节序的一些代码。

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

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