2010-02-28 35 views
21

que tienen esta función en C# para convertir una pequeña matriz de bytes endian a un número entero:¿Cómo convertir una matriz de bytes int a little endian?

int LE2INT(byte[] data) 
{ 
    return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]; 
} 

Ahora quiero volver a convertirlo en Little Endian .. Algo así como

byte[] INT2LE(int data) 
{ 
    // ... 
} 

Cualquier ¿idea?

Gracias.

Respuesta

17

Sólo revertirla, Tenga en cuenta que esta este código (como el otro) funciona sólo en una pequeña máquina Endian. (edición - que estaba mal, ya que este código devuelve LE por definición)

byte[] INT2LE(int data) 
    { 
    byte[] b = new byte[4]; 
    b[0] = (byte)data; 
    b[1] = (byte)(((uint)data >> 8) & 0xFF); 
    b[2] = (byte)(((uint)data >> 16) & 0xFF); 
    b[3] = (byte)(((uint)data >> 24) & 0xFF); 
    return b; 
    } 
+5

¿Por qué tu ejemplo único trabajo en una pequeña ¿Máquina india?AFAIK el método de cambio de bit debe ser endian-agnóstico. – nonoitall

+0

@John, estoy bastante seguro de que tu código funciona bien si el código se ejecuta en una arquitectura grande o poco endian. En cualquier caso, b [0] es el byte de orden más bajo, b [1] es el siguiente byte de orden más bajo, y así sucesivamente. –

+0

Mi error, ya que este código devuelve LE en lugar del orden natural de bytes de la CPU subyacente, funcionará en todas las arquitecturas. Eliminaré el texto incorrecto. –

7

Eso sí, a la inversa:

result[3]= (data >> 24) & 0xff; 
result[2]= (data >> 16) & 0xff; 
result[1]= (data >> 8) & 0xff; 
result[0]= data  & 0xff; 
3

Podría utilizar la clase BitConverter? Solo funcionará en hardware little endian, creo, pero debería manejar la mayor parte del trabajo pesado para usted.

El siguiente es un ejemplo artificioso que ilustra el uso de la clase:

 if(BitConverter.IsLittleEndian) 
     { 
      int someInteger = 100; 
      byte[] bytes = BitConverter.GetBytes(someInteger); 
      int convertedFromBytes = BitConverter.ToInt32(bytes, 0); 
     } 
0

Dependiendo de lo que está haciendo en realidad, podría depender de dejar el marco manejar los detalles de orden de bytes para que mediante el uso de IPAddress.HostToNetworkOrder y la función inversa correspondiente. Luego solo use la clase BitConverter para ir hacia y desde matrices de bytes.

1
public static string decimalToHexLittleEndian(int _iValue, int _iBytes) 
    { 
     string sBigEndian = String.Format("{0:x" + (2 * _iBytes).ToString() + "}", _iValue); 
     string sLittleEndian = ""; 

     for (int i = _iBytes - 1; i >= 0; i--) 
     { 
      sLittleEndian += sBigEndian.Substring(i * 2, 2); 
     } 

     return sLittleEndian; 
    } 
15

La clase BitConverter se puede utilizar para esto, y por supuesto, también se puede utilizar en ambos sistemas endian pequeño y grande.

Por supuesto, tendrá que realizar un seguimiento del endianness de sus datos. Para las comunicaciones, por ejemplo, esto se definiría en su protocolo.

Puede utilizar la clase BitConverter para convertir un tipo de datos en una matriz de bytes y viceversa, y luego usar la bandera IsLittleEndian para ver si necesita convertirla en su sistema o no.

La bandera IsLittleEndian le indicará el orden de bits del sistema, por lo que se puede utilizar de la siguiente manera:

Esto es de la página de MSDN en la clase BitConverter.

int value = 12345678; //your value 
    //Your value in bytes... in your system's endianness (let's say: little endian) 
    byte[] bytes = BitConverter.GetBytes(value); 
    //Then, if we need big endian for our protocol for instance, 
    //Just check if you need to convert it or not: 
    if (BitConverter.IsLittleEndian) 
    Array.Reverse(bytes); //reverse it so we get big endian. 

Puede encontrar el artículo completo here.

Esperanza esto ayuda a cualquiera que venga aquí :)

1
BitConverter.GetBytes(1000).Reverse<byte>().ToArray(); 
+1

¿Podría explicar por qué esto podría ayudar? –

+0

Estoy bastante seguro de que esto es en el caso de la máquina Big Endian. – Vassilis

0

Usted puede usar esta opción si no desea utilizar las nuevas asignaciones del montón:

public static void Int32ToFourBytes(Int32 number, out byte b0, out byte b1, out byte b2, out byte b3) 
{ 
    b3 = (byte)number; 
    b2 = (byte)(((uint)number >> 8) & 0xFF); 
    b1 = (byte)(((uint)number >> 16) & 0xFF); 
    b0 = (byte)(((uint)number >> 24) & 0xFF); 
} 
Cuestiones relacionadas