getbytes example endian convert cast array c# bit-manipulation

c# - example - ¿Cómo convertir un int a una pequeña matriz de bytes endian?



string to byte[] (8)

¿Podrías usar la clase here ? Creo que solo funcionará con el hardware little endian, pero debería manejar la mayor parte del trabajo pesado para usted.

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

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

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

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) { // ... }

¿Alguna idea?

Gracias.


Dependiendo de lo que realmente esté haciendo, podría confiar en que el marco maneje los detalles de endianness para usted 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.


La clase BitConverter se puede usar para esto, y por supuesto, también se puede usar en sistemas big y big endian.

Por supuesto, deberá realizar un seguimiento de la endianidad de sus datos. Para las comunicaciones, por ejemplo, esto se definiría en su protocolo.

Luego puede usar 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 convertirlo en su sistema o no.

La bandera de IsLittleEndian le dirá la endianness del sistema, por lo que puede usarlo 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.

Puedes encontrar el artículo completo here .

Espero que esto ayude a cualquiera que venga aquí :)


Puede usar esto si no desea usar nuevas asignaciones de almacenamiento dinámico:

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


Simplemente inviértalo. Tenga en cuenta que este código (como el otro) solo funciona en una pequeña máquina Endian. (edición - eso fue incorrecto, 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; }


Solo hazlo a la inversa:

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


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


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