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;
}
}
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
@ Groo: fragmento de código del póster tiene una matriz de 4 bytes –