Tengo esta función en C# para convertir un poco endian matriz de bytes a un número entero:

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

Ahora quiero volver a convertir little endian..
Algo así como

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

Alguna idea?

Gracias.

InformationsquelleAutor drowneath | 2010-02-28

8 Comentarios

  1. 21

    Acaba de invertir, tenga en cuenta que este código (como los otros) funciona sólo en un «little Endian» de la máquina. (editar – que estaba equivocado, ya que este código LE devuelve 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;
      }
    • ¿Por qué su ejemplo, su trabajo sólo en un «little-endian» máquina? AFAIK el método de desplazamiento de bits debe ser endian-agnóstico.
    • Estoy bastante seguro de que estás código funciona bien si el código se ejecuta en un big – o «little-endian» de la arquitectura. En cualquier caso, b[0] es el menor de orden de byte b[1] es la siguiente a la de menor byte de orden, y así sucesivamente.
    • Mi error, puesto que este código LE devuelve más que el natural orden de bytes de la base de la cpu, funcionará en todas las arquitecturas. Voy a quitar el texto incorrecto.
    • De acuerdo a la ECMA-335 estándar de la conversión de uint a byte (instrucción conv.i1) significa simplemente poner a cero el más importante bytes. Por lo tanto, el «& 0xFF» es excesivamente.
  2. 23

    La BitConverter clase se puede utilizar para esto, y por supuesto, también puede ser utilizado en ambos little y big endian.

    De curso, usted tendrá que seguir la pista de la endianness de sus datos. Para las comunicaciones, por ejemplo, que podría ser definido en el protocolo.

    Entonces puede utilizar el BitConverter clase para convertir un tipo de datos en una matriz de bytes y viceversa, y, a continuación, utilizar la IsLittleEndian bandera para ver si usted necesita para convertir en su sistema o no.

    La IsLittleEndian bandera le dirá la endianness del sistema, así que usted puede utilizar de la siguiente manera:

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

      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.

    Usted puede encontrar el artículo completo aquí.

    Espero que esto ayuda a cualquier persona que viene aquí 🙂

  3. 7

    Acaba de hacer a la inversa:

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

    Podrías utilizar el BitConverter clase? Sólo funciona en little endian de hardware creo, pero se debe controlar la mayoría del trabajo pesado para usted.

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

            if(BitConverter.IsLittleEndian)
            {
                int someInteger = 100;
                byte[] bytes = BitConverter.GetBytes(someInteger);
                int convertedFromBytes = BitConverter.ToInt32(bytes, 0);
            }
  5. 2
    BitConverter.GetBytes(1000).Reverse<byte>().ToArray();
    • Podría por favor explicar por qué esto podría ayudar?
    • Estoy bastante seguro de que esto es en el caso de Big Endian de la máquina.
  6. 0

    Dependiendo de lo que usted está haciendo, usted puede confiar en dejar que el marco se encargue de los detalles de peso para usted mediante el uso de IPAddress.HostToNetworkOrder y la correspondiente función de marcha atrás. Utilice sólo los BitConverter clase para ir y volver de las matrices de bytes.

  7. 0
     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;
        }
  8. 0

    Puede utilizar esta opción si no desea utilizar la nueva montón de asignaciones:

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

Dejar respuesta

Please enter your comment!
Please enter your name here