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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    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 expérimenté 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
    Points : 1 396
    Points
    1 396
    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 expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    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 : 947
    Points : 1 351
    Points
    1 351
    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 du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    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 actif
    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
    Points : 232
    Points
    232
    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 ?
    Les gens croient qu'il est agréable d'être un super-génie, mais s'ils savaient à quel point il est difficile d'être entouré de super-crétins !
    Calvin dans Calvin et Hobbes (Bill Watterson)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    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 du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    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 actif
    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
    Points : 232
    Points
    232
    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.
    Les gens croient qu'il est agréable d'être un super-génie, mais s'ils savaient à quel point il est difficile d'être entouré de super-crétins !
    Calvin dans Calvin et Hobbes (Bill Watterson)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    L'autre solution est d'écrire le fichier de façon à ce qu'il soit lisible, non ?
    J'aimerai bien mais cela n'est pas possible, enfin si, mais cela poserait problème pour la suite de mon programme.

    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.
    Concrètement, comment je dois faire car je ne vois pas trop comment sélectionner les valeurs du fichier binaire pour les transformer, ni d'ailleurs comment les transformer en C.

    Déjà un grand merci à tous pour votre aide.

  11. #11
    Membre actif
    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
    Points : 232
    Points
    232
    Par défaut
    Reprenons l'exemple fourni par Bktero.
    Dans le code fourni, tu fais un printf avec pour format "%02X". Ceci veut dire que tu vas écrire sous la forme d'un héxadécimal les 8 bits (c'est à dire un byte) que tu as lu précédemment.
    Au lieu d'écrire sous la forme d'un héxadécimal, on va écrire en binaire.
    Une idée, tout à fait porcasse, mais fonctionnelle, est la suivante :
    Au lieu d'afficher la variable "byte", tu la parcours et affiche chacun de ses bits.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (i = 0; i < 8; i++)
    {
        unsigned char pouet;
        pouet = (byte >> i ) ; // On décale l'octet de 0, puis 1, puis 2, .. bits
        pouet = (pouet & 0x01);  // On ne garde que le bit le plus à droite
        printf("%d", pouet);
    }
    Du coup, si byte vaut 0b00110101, on va afficher 10101100.
    Ce qui ne va pas. Il faut donc faire le décalage, non pas de i, mais de (7 - i), pour regarder les bits 7 puis 6, puis 5, ... puis 0.

    Bon, les puristes vont gueuler, mais cela permet aussi de comprendre le décalage et le système de masque ...
    Les gens croient qu'il est agréable d'être un super-génie, mais s'ils savaient à quel point il est difficile d'être entouré de super-crétins !
    Calvin dans Calvin et Hobbes (Bill Watterson)

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Ecrire des '0' et des '1' au lieu des 0 et des 1 serait en effet une méthode très pratique pour lire facilement le fichier. jacklafrip devrait être rebaptisé jacklafouine

    Si ça te pose soucis pour la suite, tu n'as pas 36 solutions. Soit tu trouves un logiciel capable de faire un bindump (comme il y a des hexdump pour afficher les hexa, un bindump pour affichier les valeurs binaires). Soit tu le codes toi même. C'est simple et un bon exercice.

    comment je dois faire car je ne vois pas trop comment sélectionner les valeurs du fichier binaire pour les transformer, ni d'ailleurs comment les transformer en C
    Et bien il va falloir se creuser un peu les méninges ! La première chose à faire est une fonction à laquelle tu passes un octet (un unsigned char) en paramètre et qui affiche les bits contenus dans cet octet. La seconde est de faire une fonction lisant un fichier octet par octet pour les afficher avec la première fonction.

    Comment extraire les bits qui t'intéressent d'un octet ? Avec les opérateurs binaires pardi ! Execute cette instruction pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%d %d %d", 3 & 1, 3 & 2, 3 >> 1);
    Maintenant, une petite boucle FOR, un masque pour ne garder qu'un seul bit, des décalages pour avoir un nombre valant 0 ou 1, et un affichage. Le tour est joué !

  13. #13
    Membre actif
    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
    Points : 232
    Points
    232
    Par défaut
    Et vlan, moi je donne la solution...
    Je suis vraiment pas sympa pour la réflexion...
    Les gens croient qu'il est agréable d'être un super-génie, mais s'ils savaient à quel point il est difficile d'être entouré de super-crétins !
    Calvin dans Calvin et Hobbes (Bill Watterson)

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Non, tu n'es pas très gentil pour la réflexion ^^

    Ca m'a quand même permis de me rendre compte qu'on pouvait décaler puis masquer, au lieu de masquer puis décaler...

    On va dire que tu donnes les bases et qu'on peut écrire les 4 lignes en 1, sans variable "temporaire" pour remotiver quake3.

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Points : 52
    Points
    52
    Par défaut
    On va dire que tu donnes les bases et qu'on peut écrire les 4 lignes en 1, sans variable "temporaire" pour remotiver quake3.
    Je ne sais pas si cela me remotive mais en tous cas, cela confirme le fait que je ne suis vraiment pas dans mon élément !

    J'ai vu avec un collègue et il va modifier son programme de façon à ce que je puisse faire ceci :
    L'autre solution est d'écrire le fichier de façon à ce qu'il soit lisible, non ?
    Merci beaucoup à tous, pour vos explications, vos exemples, et d'avoir pris de votre temps mais c'est clairement pas de mon niveau

    Merci encore

  16. #16
    Membre expérimenté 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
    Points : 1 396
    Points
    1 396
    Par défaut
    Citation Envoyé par quake3 Voir le message
    Merci beaucoup à tous, pour vos explications, vos exemples, et d'avoir pris de votre temps mais c'est clairement pas de mon niveau
    Je pense que tu te trompes, c'est de ton niveau, et de celui de n'importe qui s'estimant informaticien. Il suffit de comprendre que l'ordinateur ne comprend que du binaire, par conséquent ces suites de 1 et 0 sont imbuvables... Mais tu peux leur donner une interprétation ! Tu peux décider que 101 vaut 5, tu peux décider que 110000 vaut 48 et que 48 vaut 'a'. De fil en aiguille tu ajoutes des niveaux d'indirections qui permettent de donner un sens au binaire.

    Toi ce que tu veux c'est faire le cheminement inverse, qui n'est pas particulièrement plus compliqué !

    Finalement je te conseille cet article, qui t'aidera surement à comprendre l'encodage d'un fichier texte (Unicode en particulier) et je pense que tu auras un déclic http://www.joelonsoftware.com/articles/Unicode.html

  17. #17
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 365
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 365
    Points : 20 401
    Points
    20 401
    Par défaut
    Citation Envoyé par quake3 Voir le message
    Merci beaucoup à tous, pour vos explications, vos exemples, et d'avoir pris de votre temps mais c'est clairement pas de mon niveau

    Merci encore
    je n'arrive pas à comprendre ce que tu veux faire peux-tu donner l'objectif final de ton programme ?
    Si tu veux écrire des suites binaires il faut utiliser des masques logiques avec l'opérateur & et l'opérateur de décalage << comme expliquent Jacklafrip et Bktero

    Tu auras peut-être besoin de manipuler des "champs de bits" c'est à voir

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