Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Inscrit en
    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.

  2. #2
    Expert Confirmé Sénior


    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 996
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 996
    Points : 14 895
    Points
    14 895

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

  3. #3
    Invité de passage
    Inscrit en
    février 2013
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : février 2013
    Messages : 4
    Points : 0
    Points
    0

    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
    Expert Confirmé Sénior


    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 996
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 996
    Points : 14 895
    Points
    14 895

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •