2010-11-06 19 views
1

Je travaille toujours sur un auditeur ICMP fonctionnant correctement et je suis curieux de savoir comment gérer l'endianness. Ma première approche consistait à extraire les données de la mémoire tampon dans un champ approprié (array initialement) (uint etc.), puis à inverser l'ordre des octets avant de transmettre les données au membre BitConverter approprié. Bien que cela fonctionne, ce n'est pas très élégant.Comment faire face à 'Endianness'

La deuxième approche consistait à préparer le tampon entier entraîné par un réseau bidimensionnel, contenant la position et la longueur des champs, qui doivent être ajustés. Cela fonctionne aussi, avec un avantage supplémentaire que le code existant n'a pas besoin de changements, mais il manque (sévèrement) de lisibilité. Je fais un effort pour comprendre les nouveaux environnements de programmation disponibles aujourd'hui (en particulier .Net et C#), et je suis très surpris que les problèmes qui existaient en 1975 ne soient toujours pas traités de manière appropriée. J'ai eu l'une des premières cartes réseau (ISA) (ciblées pour Ethernet 1.0 et basées sur un processeur Motorola 68000) développée pour un PC (IBM) et je me souviens clairement des problèmes impliqués; pas seulement des types de base de mots multiples, mais toutes les données se trouvaient dans des «endiannnes» différentes (mots de 16 bits), ce qui a effectivement éliminé la possibilité d'obtenir des données «DMA». Je considère que c'est un très petit effort de la part d'une carte réseau, pour ajuster les données appropriées à son environnement, mais cela ne semble pas être un gros problème pour le résoudre de cette façon. (?)

Ligne de fond; Je ne peux pas croire que je sois le seul à supporter cela et j'espère sincèrement que quelqu'un a trouvé une meilleure solution que celles que j'utilise maintenant.

(ce texte traduire avec l'aide de Google translate (comme je suis Néerlandais))

+1

Non seulement vous êtes accablé par ce problème :-) Voir http://stackoverflow.com/questions/217980/c-little-endian-or-big-endian as bien. – Vlad

Répondre

0

L'approche Java est de faire juste tout grand endian même si le matériel est pas. La plupart des autres langues nécessitent une conversion entre l'hôte et l'ordre réseau. Je ne vois pas comment vous pourriez faire faire l'adaptateur réseau, car il ne connaîtrait pas la structure des données. Ce n'est que lorsque vous arrivez à la couche d'application que vous avez toutes les informations nécessaires pour effectuer la conversion.

Alors, oui, nous sommes tous bloqués en train de faire ce que vous faites ici.

+0

(merci Vlad et Jotn) Je dois être stupide; Mon adaptateur est dans mon système et mon OS est chargé; Pourtant, il (adaptateur) ne parviendrait pas à reconnaître son environnement? Je sais que c'est le cas, mais est-ce acceptable? – Nebbukadnezzar

+0

L'adaptateur ne connaît pas l'application et la structure des données envoyées sur le réseau est déterminée par l'application. Votre application pourrait envoyer des petites données endian si elle le voulait mais tout le monde standardise sur big endian. – JOTN

2

Simplement; n'utilisez pas BitConverter s'il y a un risque d'Endianness à distance (qui pour .NET signifie principalement "mono sur du matériel" AFAIK). Jon Skeet a un EndianBitConverter dans "MiscUtil" qui peut aider; sinon, faites simplement l'encodage via le décalage de bits, etc.

+0

Merci pour cela; Je vais m'y pencher, mais quelle est votre opinion sur une «vraie» solution? – Nebbukadnezzar