Я работаю на компьютере 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 это инициализируется, если я не делаю (и считают его при повреждении), не инициализированный и таким образом ложь...
Интересно, это ошибка времени, возможно, связанная с "beforefieldinit"... как вы смотрите на значение? Возможно, что тип-инициализатор (для BitConverter
) не запускается отладчиком VS (который, так сказать, подглядывает под обложки). Тем более что false
- это значение по умолчанию для поля...
Статическое поле IsLittleEndian
установлено в статическом конструкторе; а время выполнения инициализатора... очень трудно предсказать. Если вы используете отладчик, то все ставки выключены. Единственный способ надежно проверить значение этого поля - это код (когда CLR запустит инициализатор в какой-то момент до того, как он понадобится):
bool isLittleEndian = BitConverter.IsLittleEndian;
Не доверяй отладчику/смотреть окна и т.д.
.Как вы это проверяете?
Например, запустите это короткое консольное приложение:
using System;
public class Test
{
static void Main()
{
Console.WriteLine(BitConverter.IsLittleEndian);
}
}
Что это печатает? Не могли бы Вы рассказать о том, какое оборудование и какую операционную систему Вы используете?
.Как говорит Марк, это похоже на ошибку во времени. Используя отладчик VS для "заглядывания" в значение при запуске, он возвращает false, но если я распечатаю его в текстовом ящике, он возвращает true.