Моно Endianness - PullRequest
       20

Моно Endianness

9 голосов
/ 25 марта 2011

с .NET все довольно просто - все (включая ARM ASFAIK) работают с прямым порядком байтов.

Вопрос, который у меня возникает: что происходит с Mono и (потенциально) системами с прямым порядком байтов?Делают ли биты обратные (если сравнивать с x86) в структуре Int32 / Int64, или в рамках этой структуры выполняется набор правил с прямым порядком байтов?

Спасибо

Ответы [ 6 ]

13 голосов
/ 25 марта 2011

Ваше утверждение о том, что все MS .NET имеют прямой порядок байтов, неверно.Это зависит от архитектуры, на которой вы работаете - спецификация CLR гласит:

Из Аннотированного стандарта CLI (с.161) - Раздел I, раздел 12.6.3: «Порядок следования байтов»:

Для типов данных размером более 1 байта порядок байтов зависит от целевого ЦП.Код, который зависит от порядка следования байтов, может работать не на всех платформах.[...]

(взято из этого SO ответа)

См. этот ответ для получения дополнительной информации овнутренности BitConverter и то, как они справляются с порядком байтов.

3 голосов
/ 25 марта 2011

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

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

Обычно Microsoft не упоминает порядковый номер в своих документах - за некоторыми странными исключениями. Например, BinaryReader.ReadUInt16 определено для чтения с прямым порядком байтов. Ничего не упомянуто для других методов. Можно предположить, что двоичная сериализация всегда имеет порядок байтов, даже на машинах с прямым порядком байтов.

Обратите внимание, что XNA на XBox360 - это big-endian , так что это не просто теоретическая проблема с Mono.

3 голосов
/ 25 марта 2011

c # /. Net не претендует на endian.int32 / 64 являются атомарными, а не структурами.

2 голосов
/ 25 марта 2011

Чтобы узнать, являются ли байты «обратными», просто проверьте BitConverter.IsLittleEndian:

if (BitConverter.IsLittleEndian)
{
    // reverse bytes
}
2 голосов
/ 25 марта 2011

Насколько я знаю, такое преобразование произойдет за пределами вашего кода и будет скрыто от вас.По некоторым причинам, включая такие потенциальные проблемы, он называется «управляемый код».

0 голосов
/ 25 марта 2011

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

Вы всегда можете протестировать его, создав управляемое int с известным значением, затем используя отражение или маршаллинг для доступа к памяти и просмотра.

...