Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
780 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°458257
polyacetal
I was here
Posté le 15-07-2003 à 12:47:52  profilanswer
 

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:

mood
Publicité
Posté le 15-07-2003 à 12:47:52  profilanswer
 

n°458275
Taz
bisounours-codeur
Posté le 15-07-2003 à 13:02:44  profilanswer
 

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)

n°458358
pascal_
Posté le 15-07-2003 à 14:18:36  profilanswer
 

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.
 

n°458374
polyacetal
I was here
Posté le 15-07-2003 à 14:33:41  profilanswer
 

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...

n°458598
HelloWorld
Salut tout le monde!
Posté le 15-07-2003 à 18:07:16  profilanswer
 

Tu récupères comment ces fichiers ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°458606
polyacetal
I was here
Posté le 15-07-2003 à 18:13:05  profilanswer
 

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)

n°458670
polyacetal
I was here
Posté le 15-07-2003 à 18:48:30  profilanswer
 

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?

n°458675
HelloWorld
Salut tout le monde!
Posté le 15-07-2003 à 18:53:46  profilanswer
 

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
n°458684
polyacetal
I was here
Posté le 15-07-2003 à 19:03:29  profilanswer
 

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)...

n°458692
polyacetal
I was here
Posté le 15-07-2003 à 19:17:22  profilanswer
 

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...

mood
Publicité
Posté le 15-07-2003 à 19:17:22  profilanswer
 

n°458698
schnapsman​n
Zaford Beeblefect
Posté le 15-07-2003 à 19:26:39  profilanswer
 

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!"
n°459101
polyacetal
I was here
Posté le 16-07-2003 à 10:13:19  profilanswer
 

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...

n°1881535
Badry
Posté le 06-05-2009 à 17:20:52  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[XML/XSL]probleme de lien[XML/SXL]Probleme d'arborescence
Problème de popup récurrent (tjdo)[PHP/MySQL]Problème d'UPDATE avec une variable contenue dans l'url
URGENT problème avec copy() de PHP[Mysql + MyODBC]Problème de lenteur !!
Probleme avec la propriété FormulaArray sous VBA (Excel)Problème avec Winsock pour l'envoi de mail
[ASP] Problème de cache IE, parade pr forcer le dl d'un fichier sur leProblème de retour à la ligne
Plus de sujets relatifs à : Conversion little endian - big endian: problème chaines de caractères


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR