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 :

Convertir fichier binaire illisible en C en texte


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut Convertir fichier binaire illisible en C en texte
    Bonjour,

    J'ai un petit problème assez embêtant, j'ai une partie de mon code qui crée un fichier de sortie à partir de bits, de cette manière :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    uint8_t tpe[512];
     
    /* Save data */
     if (type == GKB)
     {
     char fname[100];
     int16_t block[690];
     FILE *f;
     int i;
     
     /* Open file */
     int vl=12;
     
     snprintf(fname, 100, "data_%d.out", vl);
     f = fopen(fname, "ab");
     
     /* Generate a block */
     memset(block, 0x00, sizeof(int16_t) * 690);
     for (i=0; i<6; i++)
     block[115*i] = 0x6b21 + i;
     
     for (i=0; i<114; i++)
     block[ 1+i] = tpe[ i] ? -127 : 127;
     
     for (i=0; i<114; i++)
     block[116+i] = tpe[114+i] ? -127 : 127;
     
     for (i=0; i<114; i++)
     block[231+i] = tpe[228+i] ? -127 : 127;
     
     for (i=0; i<90; i++)
     block[346+i] = tpe[342+i] ? -127 : 127;
     
     /* Write it */
     fwrite(block, sizeof(int16_t), 690, f);
     
     /* Close */
     fclose(f);
    Le problème c'est que j'obtiens un fichier illisible contenant une ligne avec du genre :
    !kÿÿÿÿÿÿNULNULNULÿÿÿÿÿNULNULNULÿNULNULÿ
    au lieu de simple 0101011101101010111100011110...

    J'aimerai juste pouvoir convertir ce fichier illisible en un fichier contenant les bits.

    A savoir : Le fichier est bon puisque j'ai testé après dans un de mes logiciels et il y a bien ce qu'il doit y avoir, seulement on ne voit que des caractères illisibles sous Notepad++. J'ai tout de suite pensé à un problème d'encodage (j'ai changé l'encodage mais mais je ne sais pas du tout comment faire.


    Si vous avez des idées pour faire ça car cela fait près de quatre jours que je cherche sans résultat...

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    C'est normal que ça ne t'affiche pas des 1 et 0. Notepad++ s'attend à un fichier texte, l'encodage utilisé dépend de comment il va interpréter (ou essayer du moins) les bits.

    Si tu veux voir ton fichier en binaire, tu peux utiliser des éditeurs plus spécialisés, mais généralement on utilise plutôt des éditeurs hexadécimaux, j'ai pas de nom en particulier.

    Tu peux également lire l'article de wikipédia : http://fr.wikipedia.org/wiki/Fichier_binaire

  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par quake3 Voir le message
    Si vous avez des idées pour faire ça car cela fait près de quatre jours que je cherche sans résultat...
    Ci dessus un dump sommaire, à toi de l'adapter pour du binaire.

    A+

    Pfeuh

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <stdio.h>
    #include <stdlib.h>
     
    int dumpFile(char* fname)
    {
        FILE* fp = NULL;
        size_t bytes_counter = 0;
        size_t nb_received_bytes;
        unsigned char byte;
        int err_num = 0;
     
        fp = fopen(fname, "rb");
        if(fp == NULL)
            return 2;
        while(1)
        {
            nb_received_bytes = fread(&byte, 1, 1, fp);
            if(nb_received_bytes == 0)
                break;
            if((bytes_counter & 0x0f) == 0)
                printf("\n%08x ", bytes_counter);
            printf("%02x ", byte);
           bytes_counter++;
        }
        if(fp != NULL)
            fclose(fp);
        printf("\n");
        return err_num;
    }
     
    int main(int argc, char** argv)
    {
        if(argc < 2)
            return 1;
        return dumpFile(argv[1]);
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Merci beaucoup à vous deux,

    Actuellement avec le code de pfeuh j'obtiens pleins de lignes comme celle-ci :
    00012530 7f 00 81 ff 7f 00 81 ff etc...
    mais je ne sais pas trop comment l'adapter car je ne suis pas trop à l'aise pour les conversions en fait.

    Ce qu'il y a à l’intérieur de mon fichier c'est de l’hexadécimal ? Si oui je dois convertir de l'hexa en texte en fait ? Désolé si je suis complètement dans le faux, j'ai l'impression d'être un peu perdu

  5. #5
    Membre éclairé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par défaut
    Si tu lis le fichier avec un éditeur héxadécimal, ou avec l'excellentissime vi (mode héxadécimal dans "Outils/Convertir en héxa), lis-tu la même chose que la sortie du code faite par Quake3 ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Oui je lis la même chose avec un éditeur hexadécimal qu'avec le code de pfeuh.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 496
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par quake3 Voir le message
    Ce qu'il y a à l’intérieur de mon fichier c'est de l’hexadécimal ? Si oui je dois convertir de l'hexa en texte en fait ? Désolé si je suis complètement dans le faux, j'ai l'impression d'être un peu perdu
    Tu sembles un peu perdu, en effet.

    L'information est stockée avec des bits. Des 0 et des 1. Uniquement.

    Qu'est ce que l'hexadecimal ? Simplement l'interprétation de 4 bits consécutifs pour donner un symbole (0, 1, ..., 9, A, B, ..., F). 2^4 = 16 donc 4 bits donnent bien 16 valeurs possibles.

    Ton fichier n'échappe pas à cette règle, il contient des 0 et des 1. Le code de pfeuh comme ton éditeur héxadécimal, groupe les bits par 4 pour te donner des valeurs en hexadécimal.

    Comme à partir des bits obtenir des lettres ? C'est le codage des caractères. On considère par exemple en ASCII que 'a' est codé avec la valeur hexadecimal 0x61. Il te faut 8 bits, car tu as 2 chiffres hexadécimaux. Tu as l'équivalence hexa / binaire, 0x61 = 0b1100001. Si Notepad++ trouve cette suite de bits, il affichera un 'a' à la place.

    Quand tu écris des 0 et des 1 dans un fichier texte, tu n'écris pas le caractère '1' ou le caractère '0' puisqu'il faut huit 0 ou 1 pour les coder.


    Oui je lis la même chose avec un éditeur hexadécimal qu'avec le code de pfeuh.
    A partir de ça, que peux-tu en déduire ? Si as une suite de nombres hexadécimaux, comment retrouver les bits (0 et 1) qui ont donné cette suite ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Bonjour Bktero,

    Merci beaucoup pour cette super explication, j'ai l'impression de mieux comprendre.

    Donc pour retrouver les bits, je dois décomposer les nombres hexadécimaux en traduisant la valeur du nombre hexadécimal par la valeur en binaire ? Si oui en C cela doit être compliquer nan ?

  9. #9
    Membre éclairé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par défaut
    Mais non, le C, c'est simple, facile et toujours compréhensible
    Donc, tu peux effectivement décomposer chacune des suites de 1 et de 0 qui sont dans ton fichier binaire, avec des décalages de bits par exemple.
    L'autre solution est d'écrire le fichier de façon à ce qu'il soit lisible, non ?
    Comme le dit si bien Bktero,
    Quand tu écris des 0 et des 1 dans un fichier texte, tu n'écris pas le caractère '1' ou le caractère '0' puisqu'il faut huit 0 ou 1 pour les coder.

Discussions similaires

  1. convertir fichier binaire en txt
    Par RyzenOC dans le forum Général Python
    Réponses: 15
    Dernier message: 02/04/2015, 22h00
  2. convertir fichier binaire en chaîne de caractères
    Par spake33 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 16/05/2011, 15h46
  3. Convertir un fichier texte en fichier binaire
    Par guicecal dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 04/09/2009, 11h16
  4. fichier binaire ou texte , que choisir ?
    Par Djob dans le forum C++
    Réponses: 4
    Dernier message: 19/12/2005, 16h21
  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