Avec le type de programmes que j'écris (en fonction des données de fichier brutes), j'ai souvent besoin de fonctions pour convertir entre grand et petit Endian. Habituellement, je m'écris moi-même (qui est couvert par de nombreux autres postes ici) mais je ne suis pas si heureux de le faire pour un certain nombre de raisons - la principale étant un manque de test. Je ne veux pas vraiment dépenser des âges testant mon code dans un grand émulateur Endian, et souvent omettre le code des grandes machines Endian. Je préférerais également utiliser des fonctions plus rapides fournies par divers compilateurs, tout en conservant la plate-forme multiples de mes programmes. P>
Les seules choses que je peux trouver sont des appels de socket tels que les jonces (), mais ils nécessitent différents fichiers #include sur chaque plate-forme et un code GPL Comme ce , cependant que ce fichier particulier, tandis que complète, semble manquer de certaines des fonctions hautes performances fournies par certains compilateurs. P>
Alors, est-ce que quelqu'un connaît-il d'une bibliothèque (idéalement juste un fichier .h) qui est bien testé et fournit un ensemble standard de fonctions pour faire face à l'endansion dans de nombreux compilateurs et plates-formes? P>
4 Réponses :
Il y a eu un certain nombre de propositions pour une classe de boost (pour C ++, au moins) à faire exactement cela au cours de la dernière décennie, mais aucun n'est jamais venu de concrétiser, malheureusement. P>
Je ne suis pas au courant d'une meilleure solution généralisée que le jeu de fonctions HTS (). P>
On vient d'être soumis pour examen. Ça semble très sympa. boost.cowic.de/rc/endian/doc/index.html
Il est plus facile de ne pas écrire de code dépendant de l'endian. Vous ne devriez jamais vous soucier exactement de ce que l'endiangité est du système que vous utilisez; La seule chose qui devrait avoir une matière est ce que l'endansité mandatée est pour toutes les données externes que vous lisez ou écrivez. Vous ne devriez pas demander des conversions entre les valeurs de grande et petite-sous-endienne, mais plutôt des conversions d'une endansion spécifique à l'endansion hôte, et vous pouvez écrire ce code de manière endiane-agnostique qui est (presque) complètement portable: < p> Par exemple: Supposons que vous lisiez un entier de Big-Endian 32 bits à partir d'un flux de fichiers: p> (je dis "(presque) complètement portable" parce qu'il suppose qu'il y a 8 bits par octet. Mais si vous êtes sur un système où ce n'est pas vrai, vous allez probablement avoir des problèmes plus importants lors de la gestion des données externes.) p> p>
Merci pour la réponse. Vous avez raison, je m'en fiche de l'endansion du système que je cours, mais lorsque j'ai mentionné la conversion entre grand et petit Endian, je voulais convertir entre l'hôte et le petit et l'hôte et le grand. Votre code est similaire à ce que j'ai utilisé dans le passé, mais je l'ai trouvé un peu sur le côté lent lors du traitement de quelques gigaoctets de données. (E.G. Utiliser #Ifdefs pour omettre la petite conversion Endian sur les petites plateformes d'Endian accélère les choses.) Alors je cherche quelque chose d'un peu plus optimisé.
@jamesdlin: heh. Avez-vous essayé cette approche pour lire ou écrire des flotteurs ou des doubles?
sur Linux, il y a http://man7.org/linux/man-pages/ Man3 / htole32.3.html p>
Je serais intéressé à apprendre si d'autres systèmes d'exploitation le supportent également. P>
On dirait que tous les linuxes peuvent ne pas avoir ces fonctions. Je viens d'essayer grep htobe16 / usr / include / -r code> sur une machine "SUSE Linux Enterprise Desktop 10 SP4 (x86_64)" sans résultat.
Comme l'OP, j'ai souvent besoin d'une routines conscientes d'octet-ordonnée pour les données de mélange entre différentes machines et protocoles. (Dans mon cas, j'en ai besoin de processeurs embarqués plutôt que de grand fer.) P>
Après plusieurs itérations, j'ai posté un Bibliothèque de Endian écrit dans Pure C à Github. Ce qu'il manque dans la documentation, il compense dans des tests d'unités complètes. P>
Endian code> Le départ principal de la plupart des bibliothèques de commande d'octets est qu'il ne présume pas une fonction de lecture ou d'écriture d'octets à la fois, mais fonctionne plutôt directement sur
vide * code> tampons de mémoire. Cela donne au compilateur la liberté d'optimiser ce qu'elle peut, et dans le cas où la commande d'octets souhaitée correspond à la machine hôte, elle se dépassant complètement. P>
La plupart des compilateurs peuvent reconnaître les opérations de décalage et de masque en tant que balayage de l'Endian et remplacez-les avec beaucoup de meilleurs codes pour la plupart des architectures. Ce n'est pas toujours vrai, mais si vous utilisez des plates-formes populaires avec un compilateur populaire sur cette plate-forme, vous obtenez probablement un code décent. Cochez quelques tests, comme une fonction de copie de tableau d'échantillonnage Endian et regardez le code généré pour vos architectures.
C'est intéressant. Je suppose que cela signifie que vous pouvez utiliser les opérations de quart et de masque comme une "valeur par défaut" pour des plateformes inconnues et espérons que le compilateur peut aider. Bien sûr, je préfère une implémentation de travail connue, donc je n'ai pas à essayer de l'essayer à chaque fois que j'ajoute une nouvelle plate-forme au code ...!