Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/02/2013, 18h37   #1
Grinnage
Invité de passage
 
Inscription : février 2013
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2013
Messages : 4
Points : 0
Points : 0
Par défaut Fichier binaire en decimal

Bonjour,

Je cherche à récupérer les données d'un fichier codé en binaire et de le convertir en décimal (il s'agit d'une image dont chaque pixel est représenté par un chiffre représentant son intensité).

J'ai fait un petit script dans lequel je récupère ces données :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main () 
{
 
  FILE* fichierRead;
  char* ptableau;
  int data_size=1048576; 
 
  fichierRead = fopen("abc.i33" , "rb");
 
  ptableau = (char*) calloc(data_size, sizeof(unsigned int));
  fread(ptableau,sizeof(unsigned int),data_size, fichierRead);
 
  fclose(fichierRead);
 
  system("PAUSE");
  return 0;
}
Dans un premier temps, je souhaiterais comprendre comment afficher les valeurs en binaire, puis dans un second temps les convertir en décimal et les afficher également.

Quelqu'un pourrait-il m'aider siouplait ?

Merci d'avance.
Grinnage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 19h17   #2
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 605
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 605
Points : 7 043
Points : 7 043
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Bonjour,

Les entiers sont stocké dans un ordinateur en binaire.
Un entier est codé sur un ou plusieurs octets.
Quand tu va écrire dans un fichier en binaire avec (f)write tu va copier tous les octets constituant cet entier.

Par exemple si tu as un int i valant 10 (soit 0xA en hexadécimal), tu va écrire dans ton fichier 0xA soit :
00000000 0000000 0000000 00001010

Lorsque tu va lire ton fichier binaire, il te suffira de mettre ces bit dans un autre int avec (f)read
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main () 
{
 
  FILE* fichierRead;
  int* ptableau;
  int data_size=1048576; 
 
  fichierRead = fopen("abc.i33" , "rb");
 
  ptableau = (int*) calloc(data_size, sizeof(unsigned int));
  fread( (char *)ptableau,sizeof(unsigned int),data_size, fichierRead);
 
  fclose(fichierRead);
 
  system("PAUSE");
  return 0;
}
Pour afficher le nombre en décimal, un simple printf suffit :
Pour afficher le nombre en binaire, je ne pense pas qu'on puisse le faire simplement, on préfère généralement l'afficher en hexadécimal :
Mais si tu veux vraiment l'afficher en binaire, il va faloir extraire chaque bit :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void afficherBinaire(int x)
{
       void mask = 1 << (sizeof(int)*8 - 1);
       /* sizeof int donne la taille d'un int en char (et donc en octet).
           << va décaler les bits de 1 de (sizeof(int)*8 - 1) bits "vers la gauche".
           Par exemple : 1 << 2 <=> 00001 << 2 <=> 00100
           grâce à ce bout de code on va avoir en mémoire 1000...0000 */
       while( mask ) //tant que mask est différent de 0
       {
                 if( x & mask) /* opération ET bit à bit. cf ci-dessous */
                           printf("1");
                  else
                           printf("0");
                 mask >>= 1; /* équivalent à mask = mask >> 1, on va décaler les bits "vers la droite */
        }
}
EDIT : Il faut aussi faire attention pour les données stockée en binaire :
- la taille des variable : selon la plate-forme un int peut être stocké sur 4, 8 octets (ou autre). Donc si tu lis à partir d'une plate-forme où un int est codé sur 8 octets, tu va lire 8 octet sur ton fichier. Mais si tu écris à partir d'une plate-forme où un int est codé sur 4 octets, tu ne va écrire que 4 octets.
Cf ce tutoriel
- l'endianness : comme je l'ai dit un entier est codé sur un ou plusieurs octets mais "l'ordre" des octets peut aussi varier d'une plate-forme à l'autre.
Prenons l'exemple d'un entier codé sur 2 octets on a :
0x0102 = 00000001 00000010 = 1*256 + 2 = 257
Mais sur certaines plate-formes, on va avoir :
0x0102 = 00000010 00000001 = 2 + 1*256 = 257
Dans ton fichier tu auras donc des valeurs différences.
Heureusement les fonctions htons sont là pour nous aider


Pour le ET bit à bit un lien de la FAQ : http://c.developpez.com/faq/?page=op...URS_amper_mask.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/03/2013, 11h48   #3
Grinnage
Invité de passage
 
Inscription : février 2013
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2013
Messages : 4
Points : 0
Points : 0
re Neckarra,

Tout d'abord, merci beaucoup pour ta réponse.
J'aurais toutefois une petite question a te poser:

dans le fread, pourquoi rajouter un (char*)puisque les int sont deja stockés dans un (int*) ??
Grinnage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2013, 11h53   #4
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 605
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 605
Points : 7 043
Points : 7 043
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Citation:
Envoyé par Grinnage Voir le message
re Neckarra,

Tout d'abord, merci beaucoup pour ta réponse.
J'aurais toutefois une petite question a te poser:

dans le fread, pourquoi rajouter un (char*)puisque les int sont deja stockés dans un (int*) ??
Autant pour moi, fread prend un void *.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h03.


 
 
 
 
Partenaires

Hébergement Web