Поле IsLittleEndian сообщает о лжи, но это должен быть Прямой порядок байтов?

Я работаю на компьютере Intel (64-разрядный Win7) и согласно тому, что я считал, Intel использует Прямой порядок байтов. Я испытываю это в C# со следующим кодом:

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

и b2short == 256 как ожидалось от Прямого порядка байтов.

Тогда я считал это в.NET, BitConverter. IsLittleEndian должен отразить, какой порядок байтов система использует, и когда я проверяю переменную в Visual Studio, он сообщает о лжи, т.е. это не Прямой порядок байтов.

Это имеет какое-либо отношение к 64-разрядной ОС? Какие-либо идеи?


Править: Мой коллега, который сидит напротив меня, сделал тот же тест (Победа 32-разрядный Vista) и получил те же результаты


РЕДАКТИРОВАНИЕ 2: Это ДЕЙСТВИТЕЛЬНО странно. Каждый раз, когда я выполняю код и повреждение после того, как BitConverter сделал свою вещь, IsLittleEndian == ложь. НО, если я добавляю Консоль строки. WriteLine (BitConverter. IsLittleEndian); впоследствии это - TRUE:

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

Но как только я удаляю Консоль. WriteLine это - ложь снова.

Я могу также добавить это, даже если я повреждаюсь на "Консоли. WriteLine" IsLittleEndian == верный, но если я удаляю строку в целом, это - ложь.


РЕДАКТИРОВАНИЕ 3: Как Mark Gravell указал, это должно быть некоторой ошибкой синхронизации. Если я использую переменный BitConverter. IsLittleEndian это инициализируется, если я не делаю (и считают его при повреждении), не инициализированный и таким образом ложь...

20
задан Ted 7 January 2010 в 21:36
поделиться

3 ответа

Интересно, это ошибка времени, возможно, связанная с "beforefieldinit"... как вы смотрите на значение? Возможно, что тип-инициализатор (для BitConverter) не запускается отладчиком VS (который, так сказать, подглядывает под обложки). Тем более что false - это значение по умолчанию для поля...

Статическое поле IsLittleEndian установлено в статическом конструкторе; а время выполнения инициализатора... очень трудно предсказать. Если вы используете отладчик, то все ставки выключены. Единственный способ надежно проверить значение этого поля - это код (когда CLR запустит инициализатор в какой-то момент до того, как он понадобится):

bool isLittleEndian = BitConverter.IsLittleEndian;

Не доверяй отладчику/смотреть окна и т.д.

.
20
ответ дан 30 November 2019 в 00:43
поделиться

Как вы это проверяете?

Например, запустите это короткое консольное приложение:

using System;

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

Что это печатает? Не могли бы Вы рассказать о том, какое оборудование и какую операционную систему Вы используете?

.
2
ответ дан 30 November 2019 в 00:43
поделиться

Как говорит Марк, это похоже на ошибку во времени. Используя отладчик VS для "заглядывания" в значение при запуске, он возвращает false, но если я распечатаю его в текстовом ящике, он возвращает true.

0
ответ дан 30 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: