IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fichier binaire en decimal


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 7
    Points : 5
    Points
    5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    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*) ??

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    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 *.

Discussions similaires

  1. Afficher un fichier binaire sous Windows
    Par Atomikx dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 14/12/2004, 00h29
  2. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo