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.
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.
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; }
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.
Partager