Подробности о Endian-ness и .Net?

У меня есть несколько вопросов о порядке следования байтов, которые достаточно связаны между собой, поэтому я гарантирую, что поставлю их как один вопрос:

1) Порядок байтов определяется .Net или аппаратным обеспечением?

2) Если это определяется аппаратным обеспечением, как я могу выяснить, какой порядок байтов используется в аппаратном обеспечении в С#?

3) Влияет ли порядок следования байтов на бинарные взаимодействия, такие как операторы ИЛИ, И, XOR или сдвиги? т.е. Будет ли однократный сдвиг вправо всегда смещать младший значащий бит?

4) Сомневаюсь, но есть ли разница в порядке следования байтов от разных версий .Net framework? Я предполагаю, что все они одинаковы, но я научился переставать предполагать некоторые детали более низкого уровня, такие как это.

Если нужно, я могу задать их как разные вопросы, но я полагаю, что любой, кто знает ответ на один из них, вероятно, знает ответ на все из них (или может указать мне правильное направление).


person Corey Ogburn    schedule 02.07.2010    source источник


Ответы (2)


1) Аппаратная часть.

2) BitConverter.IsLittleEndian

3) Endianness не влияет на побитовые операции. Сдвиг вправо — это сдвиг в направлении наименьшего значащего бита. ОБНОВЛЕНИЕ из комментария Oops: Однако порядок следования байтов влияет на двоичный ввод и вывод. При чтении или записи значений больше байта (например, чтение int из BinaryReader или использование BitConverter) необходимо учитывать порядок байтов. Как только значения считаны правильно, все побитовые операции выполняются как обычно.

4) Большинство версий .NET имеют обратный порядок байтов. Заметные исключения включают XBox и некоторые платформы, поддерживаемые Mono или Compact Framework.

person Stephen Cleary    schedule 02.07.2010
comment
Я не уверен, что № 4 полностью верен. Например, .Net Compact Framework работает на многих устройствах, я предполагаю, что некоторые из них имеют обратный порядок байтов. И Mono (хотя и не .Net, но действующая реализация CLR) определенно работает на платформах с обратным порядком байтов. Я думаю, Кори спрашивал, отличается ли порядок следования байтов в инкрементных версиях .Net (например, 1.0 .. 4.0) — ответ на этот вопрос — нет — это зависит только от оборудования. - person Mark H; 02.07.2010
comment
Я второй комментарий @Mark H. Порядок следования байтов определяется аппаратным обеспечением, и .Net будет просто использовать то, что есть. Однако никакие классы в .Net не будут полагаться на конкретный порядок следования байтов (или, по крайней мере, никакие классы не должны :-)), поэтому в лучшем случае вы можете сказать, что он агностичен, а не что он имеет особый порядок байтов. - person Franci Penov; 02.07.2010
comment
@Mark: я обновил ответ, чтобы отразить Mono/CF. Я считаю, что единственная платформа BE CF — это XBox. - person Stephen Cleary; 02.07.2010
comment
Меня немного интересует ваш ответ на 3. Конечно, порядок байтов влияет на сдвиг битов. Если вы читаете целое число и не интерпретируете его с правильным порядком байтов, сдвиг битов уничтожит его. - person OlimilOops; 02.07.2010
comment
@Oops: Если вы прочитаете целое число с неправильным порядком байтов, оно все равно будет неверным (например, 0x12345678 может быть прочитано как 0x78563412). Пока данные были прочитаны правильно, в первую очередь, побитовые операции должны быть в порядке. - person LukeH; 02.07.2010
comment
@LukeH спасибо за объяснение, это то, что я уже сказал. В Стивенсе этого просто не было, в остальном очень хороший ответ. - person OlimilOops; 02.07.2010
comment
Может быть глупый вопрос, но предполагая, что BitConverter.IsLittleEndian является логическим свойством, возвращающим false, в любом случае Endianness не является little-endian - есть ли способ отличить big-endian от средний порядок байтов? (Не уверен, что .NET может работать в любой системе middle-endian) - person Marcus; 24.09.2015
comment
@Marcus: Насколько я знаю, .NET еще не перенесен на PDP-11. - person Stephen Cleary; 24.09.2015
comment
@Франциск Пенов. Не верно. BinaryWriter всегда пишет в формате Little Endian. - person Sentinel; 12.11.2017
comment
@Sentinel действительно, похоже, ты прав. Метод BinaryWriter.Write() явно указывает, что он всегда записывает в порядке LE. Полезно знать, если кому-то случится прочитать двоичный поток, созданный .Net, на БЭМ с другого языка. Представляю всю ту ругань, которая последовала бы в следующую неделю погони за тонким багом... :-) - person Franci Penov; 13.11.2017
comment
@franci penov Не говоря уже о потере биткойнов, так как все мои кредитные переводы в пути переводятся с прямым порядком байтов ???? - person Sentinel; 13.11.2017

1) ни, ни... или можно сказать, либо
это было решено разработчиками железа. И вы должны решить об этом, если вы пишете программное обеспечение, которое читает/записывает определенные форматы файлов без использования внешних библиотек.
Нет проблем с порядком байтов Если вы читаете из файла
* байт
, но вы должны решите, как интерпретировать его в формате с прямым или обратным порядком байтов, если вы читаете все другие примитивные типы данных, такие как
* целые числа,
* строки,
* числа с плавающей запятой.
Аппаратное обеспечение здесь не поможет. BitConverter здесь не поможет. Только документация по формату файла может помочь и, конечно же, тестирование вашего кода...
edit: нашел хорошее объяснение здесь: http://betterexplained.com/articles/understanding-big-and-порядокбайтовспрямымпорядкомбайтов/

person OlimilOops    schedule 02.07.2010