2010-07-02 2 views
23

У меня есть несколько вопросов об энсианстве, которые связаны достаточно, чтобы я поставил их в качестве одного вопроса:Подробная информация о Endian-ness и .Net?

1) Является ли endian-ness решением от .Net или аппаратным обеспечением?

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

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

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

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

ответ

26

1) Оборудование.

2) BitConverter.IsLittleEndian

3) Порядок байтов не влияет на битовые операции. Сдвиг вправо смещается в направлении наименьших значащих бит. UPDATE from Oops 'comment: Однако, endianness влияет на двоичный вход и выход. При чтении или записи значений, превышающих байты (например, при чтении int от BinaryReader или с использованием BitConverter), вам необходимо учитывать утверждение. После правильного считывания значений все побитовые операции действуют как нормальные.

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

+2

Я не уверен, # 4 совершенно правильно. Например, .NET Compact Framework работает на многих устройствах, я бы предположил, что некоторые из них являются большими. И Mono (хотя и не .Net, но действительная реализация CLR), безусловно, работает на платформах большого уровня. Я думаю, что Кори спрашивал, отличается ли сущность от инкрементных версий .Net (например, 1.0 .. 4.0) - ответ на этот вопрос нет - это зависит только от аппаратного обеспечения. –

+2

Я второй комментарий @Mark H. Конкретность определяется аппаратными средствами, и .Net будет использовать только то, что есть. Однако никаких классов в.Net будет полагаться на определенную контенту (или, по крайней мере, ни один из классов не должен :-)), поэтому в лучшем случае вы можете сказать, что это агностик, а не то, что у него есть особая эндиантность. –

+0

@Mark: Я обновил ответ, чтобы отразить Mono/CF. Я считаю, что единственной платформой BE CF является XBox. –

0

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