Accueil > Forum > > > > Binaire Hexa :-S Un petit soutient svp
Binaire Hexa :-S Un petit soutient svp
mercredi 25 juillet 2007 à 09:03:49 |
Binaire Hexa :-S Un petit soutient svp

MrDimanche
|
Bonjour, voila ce qui m'amène. Je dois lire un fichier de données binaire, et le convertir. Mais si j'ai une petite expérience en c, c'est la première fois que je fais ce genre de travail, et je m'embrouille. Le fichier se trouve generalement en mots de 32 bits, mais pas toujours, et mon programme ne lit que par mots de 32 bits (que je met dans un buffer[]). Mais mon plus gros problème est que un mot dont la valeur est 0bf6752e sort tel que 2e75f60b, soit chaque octet à l'envers. Ce qui m'amène à mes deux questions : comment faire pour mon programme lise plutôt octets par octets, ou même bit par bit (certaines données sont sur 1 bit), et comment inverser chaque mots pour retrouver la bonne valeur ? Merci pour votre aide, je sais qu'ainsi ce n'est pas très clair, mais je joint le programme que j'ai récupéré, et j'ai bricolé quelques solution, mais ça ne marche pas toujours : /* fread example: read a complete file */ #include <stdio.h> #include <stdlib.h>//fonction qui permet d'inverser les octet dans 32 bits, mais ne marche pas toujours int reverseByte(int buffer) { int tamp=0; tamp=16777216*(buffer-256*(int)(buffer/256)); tamp=tamp+65536*((int)(buffer/256)-(256*(int)(buffer/65536))); tamp=tamp+256*((int)(buffer/65536)-(256*(int)(buffer/16777216))); tamp=tamp+(int)(buffer/16777216); return tamp; }
int main () { FILE * pFile; long lSize; int * buffer; size_t result; int i,n,MainN; pFile = fopen ( "/Users/nicole/Nemo/nemo_ph1_R00000018_F00000005.dat" , "rb" ); if (pFile==NULL) {fputs ("File error",stderr); exit (1);} // obtain file size: fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); // allocate memory to contain the whole file: buffer = (int*) malloc (sizeof(int)*lSize); if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} // copy the file into the buffer: result = fread (buffer,1,lSize,pFile); if (result != lSize) {fputs ("Reading error",stderr); exit (3);} /* the whole file is now loaded in the memory buffer. */ for(i=0;i<3;i++) printf("%.8x\n",buffer[i]); // terminate //printf("%x\t",(int)(buffer[0])/65536); fclose (pFile); buffer[0]=reverseByte(buffer[0]); printf("The version date : %d\n",buffer[0]); buffer[1]=reverseByte(buffer[1]); printf("The size (byte): %d\n",buffer[1]); //cette partie marche, mais par pour chaques mot :s free (buffer); return 0; }
|
|
mercredi 25 juillet 2007 à 09:49:26 |
Re : Binaire Hexa :-S Un petit soutient svp

BruNews
|
tamp=16777216*(buffer-256*(int)(buffer/256)); ce genre de ligne est tout droit issu de VB, en C on a des opérateurs de bits (<< , >>).
Dans tous les cas c'est totalement inutile, les octets ne s'inversent pas dans un fichier.
ciao... BruNews, MVP VC++
|
|
mercredi 25 juillet 2007 à 10:37:46 |
Re : Binaire Hexa :-S Un petit soutient svp

ctx_man
|
Petite astuce pour retourner un mot super facilement :
char* FileStream; //On va utiliser un pointer de caractère pour lire
int* Buffer;
Buffer = (int*) malloc (sizeof(int)*lSize);
FileStream = (char*)Buffer; //Faire pointer ton char* sur ton Buffer
result = fread (FileStream,1,lSize,pFile);
Et voila, grace a l'arithmétique des pointeurs, ton entier est écrit a l'envers.
En fait ton problème de retournement via d'ailleur de la je pense.
En gros tu écrit des int et tu lit des char, donc si ta mémoire est en adresse forte = poid faible (little-endian si je me trompe pas ce qui est fort probable) alors la lecture en char va t'inverser les données. Puisque dans ton fichier le poids faible est est l'adresse faible et il va se retrouver à l'adresse faible de ton int, qui en mémoire représente le poid fort. (Je doute fortement de la clareté de mes propos la ...)
Enfin bref, si tu lit des mots de 32 bits, alors lit par block de 32 bits.
result = fread (buffer, 4, lSize / 4, pFile);
Si vraiment c'est pas possible et que mon astuce précitée ne fonctionne pas, alors voici comment on fait un retournement normalement
int Retournement(int n)
{
return = ((n & 0xFF000000) >> 24) | ((n & 0x00FF0000) >> 8) | ((n & 0x0000FF00) << 8) | ((n & 0x000000FF) << 24);
}
(en espérant pas me planter :D )
|
|
mercredi 25 juillet 2007 à 11:44:33 |
Re : Binaire Hexa :-S Un petit soutient svp

BruNews
|
Juste pour info: cpu est cablé en dur pour le faire, imbattable.
__declspec(naked) int __fastcall Retournement(int n) { __asm { bswap ecx mov eax, ecx ret 0 } }
ciao... BruNews, MVP VC++
|
|
mercredi 25 juillet 2007 à 11:53:15 |
Re : Binaire Hexa :-S Un petit soutient svp

ctx_man
|
Lol, l'artillerie lourde, on sort l'asm !
|
|
Cette discussion est classée dans : buffer, int, file, tamp, pfile
Répondre à ce message
Sujets en rapport avec ce message
conversion [ par coyotedef ]
salut!!lors de la compilation de mon code une erreur apparait. impossible de trouver un remede. "cannot convert parameter 1 from 'char [10]' to 'char'
read/write file AMELIORER MON AFFREUX CODE [ par elroulianito ]
voila g déposer une source comportant une fonction qui a besoin d'être écrite proprement.(l'appli fonctionne et tous les fichiers du projet sont dispo
E/S sur port série [ par Gaelle ]
SalutMon prog (sous VC++6) gère le port serie pour l'envoi et la reception d'info. J'utilise pour cela les fonctions _outp(PORT, int) et _inp(PORT)Mon
fopen() [ par JCpp ]
J'ai un pb pas bien méchant.long lSize;char * buffer;FILE * pFile = fopen ("c:\\toto.txt", "r" );while ( fgetc(pFile) !=EOF){ lSize = ftell (pFile); r
lecture de flux et conversion de données [ par amin79 ]
J'ai un fichier texte "donnees.txt" contenant les données suivantes :1 4 62 7 9 3 2 19 4 8 17où la première colonne désigne le n° d'une tâche, la deux
Affichage du buffer à l'écran [ par CyberP ]
Voilà, j'ai fait un programme censé afficher différentes figures à l'écran... Après plusieurs calculs, le résultat est stocké dans un buffer et je vou
Mettre un fichier .exe dans un buffer [ par guiguikun ]
Je n'arrive pas a mettre un fichier executable en memoire.sur les 100Ko du fichier, mon buffer ne compte que les 3 premiers octets (caracteres)voici m
Hachage fermé problème de lecture [ par mcflysupersonic ]
Bonjour je suis nouveau sur le forum est ceci est ma première question donc j'espère que je ne me suis pas trompé d'endroit pour poster.Voilà j'ai un
Avis des PROS! [ par UnExPeCtEdSpy ]
Bonjour,je suis plus familier du vb que du c++ alors j'vous d'mande de l'aide :J'utilise une Dll en c+ avec un prog en Vb qui manipule des fichiers.Qu
recuperation de string [ par bob82fr ]
hi,j'aimerais recupere un string apres une chaine que j'ai identifie.J'ai un fichier myfile.txt, dans lequel on trouve:cacheMissRate:52pross:200...J'a
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|