2011-06-16 7 views
8

Tengo una matriz de bytes, y me gustaría leer un número entero de esta matriz. ¿Cómo puedo hacerlo?Cómo leer un entero de un byte []

Algo como esto:

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

etc ...

Respuesta

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

Aunque en cuanto al rendimiento, sería mejor tener dos clases separadas para Big y Little Endian, en lugar de invertir la matriz cada vez. Además, dado que la pregunta original del OP tiene una matriz de 4 entradas, las palabras individuales de 4 bytes deberían invertirse. Y dado que la arquitectura del sistema se conoce de antemano, el enfoque OOP tendría mucho más sentido. – Groo

+0

@ Groo: fragmento de código del póster tiene una matriz de 4 bytes –

3

Usted podría utilizar BitConverter.ToInt32. Eche un vistazo al this.

2

Si quisiera hacerlo manualmente, algo así debería ser el truco.

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

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

Además, hay una clase llamada Endian en de miscutil library Jon Skeet que implementa los métodos de conversión entre una matriz de bytes y varios tipos primitivos, teniendo en cuenta endianness.

Por su pregunta, el uso sería algo así como:

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

Una versión simplificada de la clase Endian sería algo así como:

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

Y luego se implementa el método abstracto FromBytes diferente para cada tipo endian.

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

Creo que sería genial si también hubiera algún código para producir los bytes del entero aquí. De lo contrario (en la mayoría de los casos) alguien no puede usar este código sin adivinar esa parte. :( – user2173353

Cuestiones relacionadas