2016-08-01 5 views
0

J'écris une classe RawFile en C++ (le langage n'a pas d'importance ici). Mais, je voudrais garder la bibliothèque totalement générique quel que soit le CPU pour lequel elle est compilée.Comment lire les fichiers bruts d'une manière générique (petit/grand endian)?

Pour l'instant, j'ai une fonction uint16_t swap16(uint16_t value) qui intervertir les deux octets et retourner un entier non signé et une fonction bool is_bigendian() qui reviennent true si le système est en big-endian et false autrement (j'ai décidé d'ignorer le PDP-11 octets système d'ordonnancement, car il est très peu probable qu'il soit rencontré). Enfin, j'ai l'endianness du fichier brut que je suis en train de lire.

La question est la suivante, étant donné l'information de l'endianness du fichier et du système, comment puis-je décider si j'applique la fonction swap16()?

Pour l'instant, j'ai décidé d'utiliser le test suivant:

return (file_is_big_endian || system_is_big_endian) ? swap16(value) : value; 

Je supposais le tableau suivant:

sytem\rawfile | little-endian | big-endian | 
-------------------------------------------- 
little-endian | No swap16() | swap16() | 
    big-endian | swap16() | swap16() | 

Mais, je ne suis pas vraiment sûr si cela est correct, je pourrais être Il manque quelque chose.

Toutes les bonnes explications (ou meilleurs tests) sont les bienvenues!

Répondre

0

Je réponds à ma propre question ...

En fait, je compris que je lisais l'octet par octet de fichier (dans un « mode brut »). Donc, le fait que le système lui-même soit petit-boutiste ou big-endian est tout simplement hors de propos. Il suffit de considérer le type du fichier que vous lisez à modifier l'ordre (ou non) l'ensemble d'octets que vous lisez ... Donc, le test est simplement:

return (file_is_big_endian) ? swap16(value) : value; 

Probablement juste une question stupide ...