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 :

Cryptographie, image format .bmp, fonctions fopen/fread.


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Cryptographie, image format .bmp, fonctions fopen/fread.
    Bonjour,

    je suis entrain de réaliser un projet informatique pour mon dut geii qui porte sur la cryptographie. Le but de ce projet est d'insérer dans une image au format .BMP un message caché grâce à la transparence des couleurs.

    la première partie du projet consiste à déterminer si l'image est bien au format .BMP . voici comment se présente ma fonction d'analyse :

    Fichier Header tete.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //définition des types de base.
    typedef unsigned char byte;
    typedef unsigned short int word;
    typedef unsigned long int dword;
    //structure de l'entete fichier.
    typedef struct tete_f {
            byte signature[2];
            dword taille;
            dword inconnu;
            dword offset;
            }tete_f;
    Fonction Main :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "tete.h"
     
    //initialisation des fonctions du programme.
    int LitHeader(FILE *out);
     
    int main(int argc, char *argv[])
    {
        FILE *out;
     
        out=fopen("picto.bmp","rb");
     
        if (LitHeader(&*out)==1){
                        ...
           }
        else {
             printf("L'image choisit n'est pas valide.\n");
             system("PAUSE");
             return 0;
             }
     
      fclose(out);
      system("PAUSE");	
      return 0;
    }
    Voici la fonction LitHeader appelé par main :

    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 LitHeader(FILE *out)
    {
        tete_f BMP_Header;    
     
        fread(BMP_Header.signature,2,1,out);
        printf ("signature de fichier 1. : (%c) [%c]\n",BMP_Header.signature[0],BMP_Header.signature[1]);
     
        if (fread(&BMP_Header.signature[0],2,1,out)=='B'&& fread(&BMP_Header.signature[1],2,1,out)=='M'){
           printf("je passe par le valide\n");
           return 1;
           }
        else{
           printf ("signature de fichier 2. : (%c) [%c]\n",BMP_Header.signature[0],BMP_Header.signature[1]);
           printf("je passe par le non valide\n");
           return 0;
           }
    }
    Son rôle est de déterminer si les deux premiers octets contenus dans le fichier "Picto.bmp" sont bien 'B' et 'M', si c'est le cas, la fonction renvoie '1' à la fonction main. Sinon la fonction renvoie '0'.

    J'ai mis en évidence mon problème en programmant deux fonctions "printf", une située en début de fonction, numérotée "1." , la seconde, située après la condition du "if", dans "else", numérotée "2.".

    Le programme détermine bien les lettres "B" et "M" au niveau des deux premiers octets lors de la première vérification (numérotée 1.), mais l'image n'est pas validée comme étant de format .bmp et passe alors par "else" avec pour nouvelles valeurs de signature "ê" et "N".

    Je n'ai fait que lire le fichier .bmp et poser des conditions. pourquoi les valeurs sont-elles modifiées ?

    Nom : Sans titre.jpg
Affichages : 103
Taille : 8,6 Ko

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     ....
       fread(BMP_Header.signature,2,1,out);
        printf ("signature de fichier 1. : (%c) [%c]\n",BMP_Header.signature[0],BMP_Header.signature[1]);
     
        if (fread(&BMP_Header.signature[0],2,1,out)=='B'&& fread(&BMP_Header.signature[1],2,1,out)=='M'){
           printf("je passe par le valide\n");
           return 1;
           }
    ....
    Pourquoi deux fread ? Le premier charge la signature dans BMP_Header.signature , il suffit ensuite de tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     ....
       fread(BMP_Header.signature,2,1,out);
        printf ("signature de fichier 1. : (%c) [%c]\n",BMP_Header.signature[0],BMP_Header.signature[1]);
     
        if (BMP_Header.signature[0]=='B'&& BMP_Header.signature[1]=='M'){
           printf("je passe par le valide\n");
           return 1;
           }
    ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Ah oui. En effet, c'était bien l'appel successifs de la fonction fread qui, apparemment, modifiait la valeur de ma signature... pourquoi ?

    Ma fonction LitHeader ne detecte pas les fichiers .bmp . la condition du "if" est-elle comprise par le programme ?

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par bambam978 Voir le message
    Ah oui. En effet, c'était bien l'appel successifs de la fonction fread qui, apparemment, modifiait la valeur de ma signature... pourquoi ?

    Ma fonction LitHeader ne detecte pas les fichiers .bmp . la condition du "if" est-elle comprise par le programme ?
    Parce que tu lis avec le deuxième fread la suite du fichier qui naturellement n'est pas "BM" puisque qu'il a déjà été lu par le premier fread !

    Je ne comprend pas la question sur le if
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut

    Citation Envoyé par bambam978 Voir le message
    Ah oui. En effet, c'était bien l'appel successifs de la fonction fread qui, apparemment, modifiait la valeur de ma signature... pourquoi ?
    Lors du premier appel tu lis 2 octets en partant de l'offset du fichier qui vaut 0. Lorsque fread retourne, l'offset du fichier est de +2 octets.
    Lors de l'appel suivant, tu lis 2 octets en partant de l'offset du fichier qui vaut +2.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    très bien merci pour ces renseignements.

    voici mon code actuel :

    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
    int LitHeader(FILE *out)
    {
        tete_f BMP_Header;    
     
        fread(BMP_Header.signature,2,1,out);
     
        if ((&BMP_Header.signature[0],2,1,out)=='B' && (&BMP_Header.signature[1],2,1,out)=='M'){
           printf("Le fichier est au format .BMP\n");
           return 1;
           }
        else{
           printf("Le fichier n'est pas au format .BMP\n");
           return 0;
           }
    }
    ma seconde question portait sur la condition de mon "if". Lors de la lecture d'un fichier .BMP, le message renvoyé par le programme est "Le fichier n'est pas au format .BMP", par contre, la signature est bien 'B' 'M'.
    Ma condition ne doit donc pas être valable. Comment dois-je l'améliorer ?

  7. #7
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Je crois qu'il y a mauvaise utilisation des pointeurs.

    D'abord tu veux lire le header dans la structure BMP_Header que tu as déclarée. Il faudrait indiquer à fread l'adresse de cette structure. On utilise & pour obtenir l'adresse d'une variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(&BMP_Header,2,1,out);
    Quand on a ça tu peux commencer à regarder les données stockées dans la structure. Maintenant on n'a plus besoin de &:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (BMP_Header.signature[0]=='B' && BMP_Header.signature[1]=='M'){

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par bambam978 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if ((&BMP_Header.signature[0],2,1,out)=='B' && (&BMP_Header.signature[1],2,1,out)=='M'){
    Ma condition ne doit donc pas être valable. Comment dois-je l'améliorer ?
    Effectivement. Tu compares out et 'B'...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((&BMP_Header.signature[0],2,1,out)=='B')
    Tu as oublie de corriger ta condition en enlevant fread

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    oO ... eurf. merci ^^

    Mon dernier problème en plus de celui-ci était que j'utilisai l'adresse du tableaux au lieu de la valeur qu'il possédait.

    Ma fonction marche maintenant. la voici :

    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
    int LitHeader(FILE *out)
    {
        tete_f BMP_Header;    
     
        fread(BMP_Header.signature,2,1,out);
     
        if ((BMP_Header.signature[0])=='B' && (BMP_Header.signature[1])=='M'){
           printf("Le fichier est au format .BMP\n");
           return 1;
           }
        else{
           printf("Le fichier n'est pas au format .BMP\n");
           return 0;
           }
    }
    Merci pour votre aide.

Discussions similaires

  1. Superposer deux images au format BMP, JPG ou PNG
    Par Henri-gp dans le forum Langage
    Réponses: 39
    Dernier message: 22/12/2016, 14h42
  2. Enregistrer une image de format BMP
    Par bilal_inf dans le forum C++Builder
    Réponses: 1
    Dernier message: 07/04/2007, 17h18
  3. Image format png
    Par JlouisI dans le forum Delphi
    Réponses: 8
    Dernier message: 28/06/2006, 19h12
  4. Champ BLOB pour IMAGE format JPG and TImage et Interbase
    Par alain_bastien dans le forum InterBase
    Réponses: 1
    Dernier message: 20/10/2004, 16h15
  5. [Images] format TIFF
    Par ksly dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/06/2003, 16h01

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