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 :

Récupérer LSB fichier C++


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Récupérer LSB fichier C++
    Bonjour,
    Je suis étudiant en informatique (plutôt débutant en C++ donc) et j'ai un problème dans un programme que j'essaie de faire : j'ai besoin de lire des LSBs pour assembler ses derniers dans un fichier résultant (récupérer un texte caché par stéganographie dans une image .bmp). Voici mon code.

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std;
     
    int car_nbre(char car);
     
    int main() {
     
    	// Initialisation des variables
     
    	string nomimg = ""; // Variable contanant le nom de l'image .bmp.
    	string resultat = ""; // Variable contenant le nom du fichier résultant
    	int npass = 0; // Variable pour compter les passes (étapes)
    	char octelch;
    	int octel;
     
     
    	// Affichage du titre
     
    	cout << "Steganographie - Programme de dechiffrage d'une image .bmp !" << endl;
     
    	// Obtention des informations
     
    	cout << "Veuillez entrer le chemin de l'image a decoder (avec l'extention de fichier) :" << endl;
    	getline(cin, nomimg); // Saisie du nom de l'image (avec l'extention)
    	cout << "Veuillez entrer le nom du fichier resultant avec le chemin de sauvegarde (avec l'extention de fichier) :" << endl;
    	getline(cin, resultat); // Saisie du nom du fichier résultant (avec l'extention)
     
     
    	// Pré-traitement :
     
    	ifstream img(nomimg, ios::binary | ios::in | ios::out); // Chargement de l'image (bibliothèque fstream)
    	ofstream msg(resultat); // Créer et ouvrir un fichier (qui peut-être d'un type quelconque - ici un .txt)
     
            if (img) { // Si l'image s'est bien ouverte
     
    		// Traitement
     
    		// while (!img.eof()) {
    			// img.get(&octel, 8);
    			// img.read(&octel, 8);
    			// octel = octel % 2;
    			/*for (int i = 0; i < 8; i++) {
    				// octel = img.get();
    				octel = 0; // On remet la variable à 0 par sécurité
    				img.read((char *)&octel, 1);  // Le problème est à cette ligne...
    			}*/
    		for(int i = 8; !img.eof(); i + 8){
    			img.read((char *)&octelch, i);
     
    			cout << endl << octelch << endl;
    			// octelch = octel;
    			//octel = car_nbre(octelch);
     
    			//msg.put(octel); // Inscription du bit dans le fichier résultant
     
    			cout << "OK, passe numero " << npass++ << " ." << endl; // Numéro de la passe (étape de trairement)
    		}
     
    		// Post-traitement
     
    		img.close(); // Décharger l'image de la mémoire (la fermer)
    		msg.close(); // Enregistrer et fermer le fichier message
     
    		cout << "Traitement termine !" << endl; // Message de fin de traitement
    		cout << "Fichier resultant enregistre sous " << resultat << endl; // Rappel du chemin d'enregistrement du fichier résultant
    	}
    	else cerr << "Impossible d'ouvir l'image"; // Message d'erreur si l'image n'a pas pu être ouverte
     
    	return 0;
    }
     
    int car_nbre(char car) {
    	int nbre;
    	if (car == '0') nbre = 0;
    	else if (car == '1') nbre = 1;
    	else cout << "Erreur" << endl;
     
    	return nbre;
    }
    J'utilise donc la bibliothèque fstream pour accéder à mon image et pour générer un fichier. Le problème est d'après moi que je ne récupère pas réellement les LSBs sous une variable int mais sous une variable char (j'obtiens une erreur lorsque j'utilise une variable de type int). Cette variable est donc nommée octelch. J'essaie donc de convertir les bits en texte en nombre via la fonction car_nbre, le résultat est stocké dans la variable int octel.
    Le problème est ici que le programme me retourne systématiquement la sortie d'erreur dans la fonction car_nbre, j'ai donc affiché pour déboguer, la variable char octelch pour vérifier si c'était effectivement un 1 ou un 0 qu'elle contenait, et au lieu de ça j'ai caractères sans queue ni tête... En effet je ne comprends pas mon erreur étant donné que j'ai pris soin d'ouvrir mon image avec fstream en tant que fichier binaire (si j'ai bien compris la doc en anglais).
    De plus je ne sais pas s'il vaut mieux que j'utilise l'instruction fstream.read (ici img.read) ou fstream.get (je n'arrive pas à trouver une doc qui explique clairement comment on utilise cette dernière). J'ai ici fait pas mal d'essais (tous infructueux) comme vous pouvez le constater en lisant les instructions commentées... ^^
    Bref... Pas mal de couacs alors je m'en remet à ce forum... Comment puis-je résoudre ces problèmes ?

    Merci beaucoup, bonne journée.

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Quelle taille fait ton buffer de lecture ? Combien récupères-tu d'octets à chaque appel à read ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Tout d'abord voici une correction de mon code, quelques erreurs se sont glissées pendant mes tests...

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <iostream>
    #include <fstream>
    #include <string>
     
    using namespace std;
     
    int car_nbre(char car);
     
    int main() {
     
    	// Initialisation des variables
     
    	string nomimg = ""; // Variable contanant le nom de l'image .bmp.
    	string resultat = ""; // Variable contenant le nom du fichier résultant
    	int npass = 0; // Variable pour compter les passes (étapes)
    	char octelch;
    	int octel;
     
     
    	// Affichage du titre
     
    	cout << "Steganographie - Programme de dechiffrage d'une image .bmp !" << endl;
     
    	// Obtention des informations
     
    	cout << "Veuillez entrer le chemin de l'image a decoder (avec l'extention de fichier) :" << endl;
    	getline(cin, nomimg); // Saisie du nom de l'image (avec l'extention)
    	cout << "Veuillez entrer le nom du fichier resultant avec le chemin de sauvegarde (avec l'extention de fichier) :" << endl;
    	getline(cin, resultat); // Saisie du nom du fichier résultant (avec l'extention)
     
     
    	// Pré-traitement :
     
    	ifstream img(nomimg, ios::binary | ios::in | ios::out); // Chargement de l'image (bibliothèque fstream)
    	ofstream msg(resultat); // Créer et ouvrir un fichier (qui peut-être d'un type quelconque - ici un .txt)
     
            if (img) { // Si l'image s'est bien ouverte
     
    		// Traitement
     
    		while (!img.eof()) { // Tant que l'image n'a pas été entièrement traitée
    			// img.get(&octel, 8);
    			// img.read(&octel, 8);
    			// octel = octel % 2;
    			for (int i = 0; i < 8; i++) {
    		                // octel = img.get();
    				octel = 0; // On remet la variable à 0 par sécurité
    				img.read((char *)&octel, 1);  // Le problème est à cette ligne...
    			}
     
    			cout << endl << octelch << endl; // Affichage pour vérifier s'il s'agit bien d'un 0 ou un 1. 
    			// octelch = octel;
    			//octel = car_nbre(octelch);
     
    			//msg.put(octel); // Inscription du bit dans le fichier résultant
     
    			cout << "OK, passe numero " << npass++ << " ." << endl; // Numéro de la passe (étape de traitement)
     
    		}
     
    		// Post-traitement
     
    		img.close(); // Décharger l'image de la mémoire (la fermer)
    		msg.close(); // Enregistrer et fermer le fichier message
     
     		cout << "Traitement termine !" << endl; // Message de fin de traitement
    		cout << "Fichier resultant enregistre sous " << resultat << endl; // Rappel du chemin d'enregistrement du fichier résultant
    	}
    	else cerr << "Impossible d'ouvir l'image"; // Message d'erreur si l'image n'a pas pu être ouverte
     
    	return 0;
    }
     
    int car_nbre(char car) {
    	int nbre;
    	if (car == '0') nbre = 0;
    	else if (car == '1') nbre = 1;
    	else cout << "Erreur" << endl;
     
    	return nbre;
    }
    Si j'ai bien compris, le buffer est le fichier de destination. Je n'ai défini aucune taille puisque mon but est de créer un fichier à partir des 0 et des 1 que j'empile dans ce dernier (il s'appelle msg avec fstream), de plus, je ne connais pas la taille du fichier résultant ^^.
    A chaque read j'en lis 1 bit, mais je couple la lecture à une boucle for que je fais se répéter 8 fois, ce qui me permet de ne garder que le 8ème bit.

    Merci de ton aide !

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Il semble y avoir confusion : la plus petite quantité de données adressable est le byte (octet), pas le bit. Tu ne peux pas lire un flux bit à bit, il faut récupérer des « paquets de bits » dans un premier temps - un byte ou plus, donc - puis seulement ensuite les analyser.

    As-tu assimilé le cours ? De mon point de vue cet exercice paraît un cran au-dessus des capacités que tes messages laissent suggérer.

    L'image en entrée est en niveaux de gris 8-bit, j'imagine ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je me suis finalement rabattu sur du Python et suis parvenu à mes fins.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer un fichier sur Intranet
    Par nbelg27 dans le forum Access
    Réponses: 5
    Dernier message: 10/11/2005, 14h58
  2. comment récupérer les fichiers .CHK
    Par Mut dans le forum Autres Logiciels
    Réponses: 13
    Dernier message: 26/10/2005, 20h04
  3. [WebLogic] Récupérer un fichier sur le serveur...
    Par T.NightGlow dans le forum Weblogic
    Réponses: 1
    Dernier message: 29/06/2005, 16h32
  4. Récupérer des fichier
    Par j2zetka dans le forum Applets
    Réponses: 6
    Dernier message: 16/11/2004, 17h32
  5. Scanner des mails et récupérer le fichier attaché
    Par delphim dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/04/2003, 10h35

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