Conversion little endian - big endian: problème chaines de caractères

Conversion little endian - big endian: problème chaines de caractères - C++ - Programmation

Marsh Posté le 15-07-2003 à 12:47:52    

Salut,
j'ai créé un logiciel (en c++) qui doit lire des fichiers binaires. La plupart du temp il viennent de PC et pas de problème... seulement dans certains cas, il vienne de stations UNIX et sont donc en big endian.  :fou:  
J'ai donc créé une petite moulinette de conversion et ca interverti bien mes octets  :) (sous un éditeur hexa j'avait 01 02 03 04 et après 04 03 02 01 par exemple). Le problème vien des chaines de caractères qui, elle ne doivent a priori pas être interverties (dans le fichier unix, si j'avais "CHAINE  " ca me donne "IAHC  EN" ): comment on peut faire pour savoir si il faut ou non intervertir les octets si on ne connait pas le format du fichier à l'avance?   :pt1cable:  
J'espère être clair dans ma question  :heink:

Reply

Marsh Posté le 15-07-2003 à 12:47:52   

Reply

Marsh Posté le 15-07-2003 à 13:02:44    

ben les stations unix peuvent utiliser la meme endianess que ton PC. ton problème est insoluble: tu te frottes à un problème ou il n'y a que 2 solutions viables: décider une fois pour toute de lordre des octets(et il existe plein d'autre chose que little et big) ou utiliser une représentation textuelle portable. bref il faut revenir à ce qu'est un fichier binaire: un fichier non binaire. rien à voir avec l'OS. tu vas peut etre arriver à te démener pour faire marcher avec un seul fichier venant d'un ordinateur particulier, mais ça ne marchera pas avec les autres. pense aussi à autre chose: la taille des entiers vairent d'une machine à l'autre (la taille d'un int varie)

Reply

Marsh Posté le 15-07-2003 à 14:18:36    

Je trouve ta question un peu bizarre.
Normalement, quand tu lis un fichier, tu sais si tu dois lire des nombres ou des chaines de caracteres.
Si tu lis des nombres, tu transformes.
Si tu lis des chaines, ben c'est bon, tu ne fais rien de plus.
 
Apparement, ton problème vient du fait que tu ne sais pas ce qu'il y a dans le fichier => aucune solution possible sans savoir ce que tu lis.
 

Reply

Marsh Posté le 15-07-2003 à 14:33:41    

En fait, je sais ce que je dois lire mais le format est assez complexe et si je me lance dans la gestion de tous les cas, j'en ai pour un bon bout de temps mais si je ne peux as y échapper, c'est ce que je vais faire...
Pour être plus précis je dois lire des OP2 venant de NASTRAN (un logiciel de calcul elements finis) qui tourne sur pc ou sous unix, d'ou les deux possibilités de format de fichier. Les fichiers OP2 contiennent des dizaines de sortes de résultats et pour chaque type il y a des valeurs entières, réelle et ascii... ce qui fait une masse de travail assez grande si je dois faire du cas par cas...

Reply

Marsh Posté le 15-07-2003 à 18:07:16    

Tu récupères comment ces fichiers ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 15-07-2003 à 18:13:05    

En général, ils tournent sur un serveur mais je ne sais pas comment les gens les récupèrent... en tout cas, dans un éditeur hexa, les octets sont bien inversés 4 par 4... sauf pour les chaines de caractères...
mais je pense qu'effectivement je vais devoir traiter tous les cas ou il y a des chaines de caractères(les positions de ces chaines dépendent des valeurs entières et réelles du reste du fichier)

Reply

Marsh Posté le 15-07-2003 à 18:48:30    

Vu que c'est des données 32 bits, je pense transformer tout le fichier puis rechercher les endroit ou il y a des chaines de caractères pour les remettre dans le bon ordre...
Est-ce que ca c'est correct si je veut inverser tout mon fichier?:

Code :
  1. char c0,c1,c2,c3;
  2. while(fread(&c0,1,1,entree) != 0)
  3.     {
  4.     fread(&c1,1,1,entree);
  5.     fread(&c2,1,1,entree);
  6.     fread(&c3,1,1,entree);
  7.     fwrite(&c3,1,1,sortie);
  8.     fwrite(&c2,1,1,sortie);
  9.     fwrite(&c1,1,1,sortie);
  10.     fwrite(&c0,1,1,sortie);
  11.     }


Le problème c'est que mon fichier de sortie ne fait pas la même taille que mon fichier d'entrée  :pt1cable:  ... quelqu'un voit-il une solution?

Reply

Marsh Posté le 15-07-2003 à 18:53:46    

C'est un peu cavalier ton code, que se passe-t-il si le fichier d'entré n'a pas une taille multiple de 4 ?
Par curiosité, la différence de taille des 2 fichiers est de combien ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 15-07-2003 à 19:03:29    

Je sais que le fichier à obligatoirement une taille multiple de 4 (les réels et entier sont sur 32 bits et les valeurs alphanum sont écrites par groupe de 4 caractères)...
Mon fichier d'entrée fait 7033748 octets et le fichier de sortie 7049435 octets  :pt1cable: (heu, c'est impaire mais ca doit être du au fait que je fait un read dans le while pour savoir si c'est la fin du fichier)...

Reply

Marsh Posté le 15-07-2003 à 19:17:22    

Heu... c'est bon pour le nombre d'octets: j'ouvraibien le fichier pour lecture binaire (flag: wb), mais pour l'écriture j'avais oublié le b...

Reply

Marsh Posté le 15-07-2003 à 19:17:22   

Reply

Marsh Posté le 15-07-2003 à 19:26:39    

Au moment où tu lis chaque groupe de 4 octets, tu dois savoir sous quel format le décoder, tu ne peux pas y couper (parce qu'il n'y a pas moyen de différencier 4 octets qui représentent un entier au format machine -x86, sparc, etc- de 4 octets qui font parties d'un texte ascii).


Message édité par schnapsmann le 15-07-2003 à 19:27:08

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 16-07-2003 à 10:13:19    

OK merci, je m'en suis sorti    :)  :  
dans un premier temp je converti tout le fichier et après, en fonction des valeurs réelles et entières je déduit les emplacement ou il doit y avoir du texte et là je re-inverse pour que ca revienne dans le bon sens...

Reply

Marsh Posté le 06-05-2009 à 17:20:52    

Bonjour,
Je suis à la recherche du format de lecture des fichiers op2 nastran. EN fait, j'utilise le C, C++ et fortan pour lire des fichiers résultats de calcul élément finis pour les post traiter en fatigue.
Jusqu'à là je n'ai pas trouvé une documentation claire sur le format des fichiers op2.  
Je serai reconnaissant si quelqu'un ici peut m'aider dans ce sens.
merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed