toint32 example bytes c# windows-7

c# - example - byte[] to int



El campo IsLittleEndian informa que es falso, pero debe ser Little-Endian? (4)

¿Cómo lo estás comprobando?

Por ejemplo, ejecute esta aplicación de consola corta:

using System; public class Test { static void Main() { Console.WriteLine(BitConverter.IsLittleEndian); } }

¿Qué imprime eso? ¿Podría dar detalles sobre qué hardware y sistema operativo está utilizando?

Estoy ejecutando en una computadora Intel (Win7 de 64 bits) y, según lo que leo, Intel está usando Little-Endian. Intento esto en C # con el siguiente código:

byte[] b2 = new byte[] { 0, 1 }; short b2short = BitConverter.ToInt16(b2, 0);

y b2short == 256 como se espera de un Little-Endian.

Luego leí que en .NET, el BitConverter.IsLittleEndian debería reflejar qué endian está usando el sistema, y ​​cuando verifico la variable en Visual Studio, informa que es falso , es decir, NO es Little-Endian.

¿Eso tiene algo que ver con el sistema operativo de 64 bits? ¿Algunas ideas?

EDITAR: Mi colega, que se sienta frente a mí, hizo la misma prueba (Win Vista de 32 bits) y obtuvo los mismos resultados

EDIT 2: Esto es muy extraño. Cada vez que ejecuto el código y se rompe después de que BitConverter haya hecho lo suyo, IsLittleEndian == false. PERO, si agrego la línea Console.WriteLine (BitConverter.IsLittleEndian); después es VERDADERO:

byte[] b2 = new byte[] { 0, 1 }; short b2short = BitConverter.ToInt16(b2, 0); Console.WriteLine(BitConverter.IsLittleEndian); // Now the IsLittleEndian is true

Pero una vez que quito la Console.WriteLine es falso otra vez.

También puedo agregar que incluso si rompo en "Console.WriteLine" el IsLittleEndian == true, pero si elimino la línea por completo, es false.

EDIT 3: Como señaló Mark Gravell, esto debe ser un error de tiempo. Si utilizo la variable BitConverter.IsLittleEndian, se inicializa, si no (y la observo cuando se rompe) no está inicializada y, por lo tanto, es falsa ...


Como dice Marc, parece ser un error de tiempo. Al usar el depurador VS para "mirar" el valor en el inicio, devuelve falso, pero si lo imprimo en un buzón de mensajes, devuelve verdadero.


Me pregunto si este es un error de tiempo, quizás relacionado con "antes de que aparezca en el campo" ... ¿cómo ve el valor? Es posible que el inicializador de tipo (para BitConverter ) no sea activado por el depurador de VS (que está mirando debajo de las coberturas, por así decirlo). Especialmente porque false es el valor predeterminado para un campo ...

El campo estático IsLittleEndian se establece en el constructor estático; y el tiempo que se ejecuta un inicializador es ... muy difícil de predecir. Si está utilizando un depurador, todas las apuestas están desactivadas. La única forma de verificar de forma confiable el valor de este campo es a través del código (cuando el CLR ejecutará el inicializador en algún momento antes de que sea necesario):

bool isLittleEndian = BitConverter.IsLittleEndian;

No confíe en el depurador / ver ventanas, etc.


Raymond Chen da una respuesta ampliada a la pregunta .

La esencia de esto es que:

La lectura de un miembro del depurador no ejecuta el código para inicializar ese miembro.

Por lo tanto, cuando vea el campo en Visual Studio, informará de falso porque el inicializador estático aún no se ha ejecutado. Sin embargo, si usa el campo en el código, el inicializador estático se ejecutará, lo que hará que el campo devuelva el valor correcto real.