2010-07-02 6 views
23

J'ai quelques questions à propos de l'endian-ness qui sont assez liées pour que je les mette en une seule question:Détails sur Endian-ness et .Net?

1) L'endian-ness est-il décidé par .Net ou par le matériel?

2) Si c'est décidé par le matériel, comment puis-je savoir quel est le matériel endian en C#?

3) L'endianité affecte-t-elle les interactions binaires telles que les OR, les AND, les XOR ou les décalages? C'EST À DIRE. Est-ce que le déplacement vers la droite décalera toujours le bit le moins significatif?

4) J'en doute, mais existe-t-il une différence d'endianité entre les différentes versions du framework .Net? Je suppose qu'ils sont tous les mêmes, mais j'ai appris à arrêter de supposer certains des détails de niveau inférieur tels que celui-ci.

Si nécessaire, je peux poser ces questions comme différentes, mais je pense que quiconque connaît la réponse à l'un d'eux connaît probablement la réponse à tous (ou peut me diriger dans une bonne direction).

Répondre

26

1) Le matériel.

2) BitConverter.IsLittleEndian

3) Endianness ne modifie pas les opérations au niveau du bit. Le déplacement vers la droite se déplace dans la direction du bit le moins significatif. MISE À JOUR du commentaire d'Oops: Cependant, l'endianness affecte l'entrée et la sortie binaires. Lorsque vous lisez ou écrivez des valeurs supérieures à un octet (par exemple, en lisant un int à partir d'un BinaryReader ou en utilisant BitConverter), vous devez tenir compte de l'endianness. Une fois les valeurs correctement lues, toutes les opérations sur les bits agissent normalement.

4) La plupart des versions de .NET sont peu endian. Les exceptions notables incluent la XBox et certaines plates-formes supportées par Mono ou le Compact Framework.

+2

Je ne suis pas sûr # 4 est tout à fait correct. Par exemple, le .Net Compact Framework fonctionne sur de nombreux périphériques, je suppose que certains d'entre eux sont big-endian. Et Mono (bien que n'étant pas .Net, mais une implémentation CLR valide) fonctionne certainement sur des plateformes big-endian. Je pense que Corey demandait si l'endianness diffère avec des versions incrémentales de .Net (par exemple, 1.0 .. 4.0) - la réponse à cette question est non - cela dépend du matériel seulement. –

+2

Je vais commencer le commentaire @Mark H. L'endianness est décidé par le matériel et .Net utilisera juste ce qu'il est. Cependant, pas de cours dans.Le net s'appuiera sur l'endianness particulier (ou au moins aucune classe ne devrait pas :-)), donc au mieux vous pouvez dire qu'il est agnostique, pas qu'il a l'endianness particulier. –

+0

@Mark: J'ai mis à jour la réponse pour refléter Mono/CF. Je crois que la seule plate-forme BE CF est XBox. –

0

1) ni ni ... ou vous pouvez dire soit
il a été décidé par les développeurs de matériel. Et vous devez décider à ce sujet si vous écrivez un logiciel qui lit/écrit certains formats de fichiers sans utiliser de bibliothèques externes.
Il n'y a pas de problème avec ENDIANNESS Si vous lisez un fichier
* un octet
mais vous devez décider comment interprete dans peu ou grand format endian si vous lisez tous les autres types de données primitifs comme
* entiers ,
* cordes,
* flotteurs.
Le matériel ne aide pas ici. Le BitConverter n'aide pas ici. Seule la documentation du format de fichier pourrait aider et tester votre code bien sûr ...
modifier: annonce trouvé bonne explication ici: http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/