2011-06-16 32 views
8

Bayt dizilim var ve bu diziden bir tamsayı okumak istiyorum. Nasıl yapabilirim? BöyleBir bayttan tamsayı okuma []

şey:

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

vs ...

cevap

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

Ref: How to: Convert a byte Array to an int

+1

Performansa rağmen, diziyi her defasında tersine çevirmek yerine, Büyük ve Küçük endian için iki ayrı sınıfa sahip olmak daha iyi olurdu. Dahası, OP'nin asıl sorusu 4 inçlik bir diziye sahip olduğundan, tek tek 4 baytlık kelimeler tersine çevrilmelidir. Sistem mimarisi önceden bilindiğinden, OOP yaklaşımı daha mantıklı olacaktır. – Groo

+0

@ Groo: Posterin kod snippet'inin 4 baytlık bir dizisi var –

3

Sen BitConverter.ToInt32 kullanabilirsiniz. this'a bir göz atın.

2

Manuel olarak yapmak isterseniz, böyle bir şey yapmalısınız!

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

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

Ayrıca Endian bir sınıf olarak adlandırılan olduğu dikkate endian alan bir bayt dizisi ve çeşitli basit türler arasında dönüştürme yöntemleri uygulayan Jon Skeet en miscutil library. FromBytes soyut yöntem için farklı uygulanmıştır sonra

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

Ve: bir şey gibi Endian sınıfından bir versiyonu olduğunu düşünüyorsanız

// 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); 
... 

: Sorunuza için

, kullanım gibi bir şey olurdu her bir endian tipi.

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

Burada tamsayıdan bayt üretmek için bazı kodlar olsaydı harika olurdu. Aksi halde (çoğu durumda) kimse bu kodu tahmin etmeden bu kodu kullanamaz. :( – user2173353