2011-06-16 61 views
8

我有一個字節數組,我想從這個數組中讀取一個整數。我該怎麼做?如何從一個字節讀取整數[]

事情是這樣的:

int i; 

tab = new byte[32]; 

i = readint(tab,0,3); // i = int from tab[0] to tab[3] (int = 4 bytes?) 

i = readint(tab,4,7); 

等等

回答

14
byte[] bytes = { 0, 0, 0, 25 }; 

// If the system architecture is little-endian (that is, little end first), 
// reverse the byte array. 
if (BitConverter.IsLittleEndian) 
    Array.Reverse(bytes); 

int i = BitConverter.ToInt32(bytes, 0); 
Console.WriteLine("int: {0}", i); 

編號:How to: Convert a byte Array to an int

+1

雖然表現明智,但最好有兩個單獨的類爲Big和Little endian,而不是每次顛倒數組。此外,由於OP的原始問題具有4個整數,所以單個4字節的單詞將不得不顛倒。由於系統架構是事先已知的,OOP方法會更有意義。 – Groo 2011-06-16 10:15:37

+0

@ Groo:海報的代碼片段有一個4字節的數組 – 2011-06-17 02:56:13

3

你可以使用BitConverter.ToInt32。看看this

2

如果您想手動執行此操作,應該這樣做!

byte[] data = ...; 
int startIndex = 0; 
int value = data[startIndex]; 

for (int i=1;i<4;i++) 
{ 
    value <<= 8; 
    value |= data[i+startIndex]; 
} 
5

另外,有一種叫做Endian類喬恩斯基特的miscutil library它實現一個字節數組和各種原始類型,考慮字節序考慮之間的轉換方法。

對於你的問題,用法是這樣的:

// Input data 
byte[] tab = new byte[32]; 

// Pick the appropriate endianness 
Endian endian = Endian.Little; 

// Use the appropriate endian to convert 
int a = endian.ToInt32(tab, 0); 
int b = endian.ToInt32(tab, 4); 
int c = endian.ToInt32(tab, 8); 
int d = endian.ToInt32(tab, 16); 
... 

Endian類的簡化版本會是這樣的:

public abstract class Endian 
{ 
    public short ToInt16(byte[] value, int startIndex) 
    { 
     return unchecked((short)FromBytes(value, startIndex, 2)); 
    } 

    public int ToInt32(byte[] value, int startIndex) 
    { 
     return unchecked((int)FromBytes(value, startIndex, 4)); 
    } 

    public long ToInt64(byte[] value, int startIndex) 
    { 
     return FromBytes(value, startIndex, 8); 
    } 

    // This same method can be used by int16, int32 and int64. 
    protected virtual long FromBytes(byte[] buffer, int startIndex, int len); 
} 

然後是FromBytes抽象方法的實現方式不同的每個末端類型。

public class BigEndian : Endian 
{ 
    protected override long FromBytes(byte[] buffer, int startIndex, int len) 
    { 
     long ret = 0; 
     for (int i=0; i < len; i++) 
     { 
      ret = unchecked((ret << 8) | buffer[startIndex+i]); 
     } 
     return ret; 
    } 
} 

public class LittleEndian : Endian 
{ 
    protected override long FromBytes(byte[] buffer, int startIndex, int len) 
    { 
     long ret = 0; 
     for (int i=0; i < len; i++) 
     { 
      ret = unchecked((ret << 8) | buffer[startIndex+len-1-i]); 
     } 
     return ret; 
    } 
} 
+0

我認爲如果在這裏還有一些用於從整數中產生字節的代碼,那將會很棒。否則(在大多數情況下)有人不能使用此代碼,而不會猜測該部分。 :( – user2173353 2016-10-04 14:54:14