Votre question

[C++] Lire et écrire directement le code hexa d'un fichier

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
17 Juin 2009 18:19:48

Bonjour,

J'ai fais pas mal de recherche et je n'arrive à rien. Je voudrais faire un programme qui, lorsqu'on le lance, crée un fichier image BMP. Je pourrais très bien fournir l'image avec le programme pour qu'il n'ait plus qu'à la recopier, mais c'est pas ce que je veux. J'aimerais que le code de l'image soit dans mon executable. Étant donné que le code ascii n'est pas toujours interprété de la même manière, je ne veux pas que mon programme écrive, comme dans un fichier texte, les symboles bizarres que l'on voit lorsque l'on ouvre une image avec le blocnote.

Dans un premier temps, j'aimerais pouvoir lire grâce a mon programme C++ le code hexa de l'image que l'on voit avec un éditeur hexadecimal pour ensuite copier ce code hexa et le mettre dans une chaine de mon code qui sera copier dans un fichier lorsque l'on désirera créer une image. Pour ce faire je cherche une manière d'écrire dans un fichier en hexa.

Exemple pour écrire:

Une variable contenant "42" ou 0x42.
Mon programme l'écrirait dans un fichier.
Et lorsque j'ouvre ce fichier avec blocnote/notepad++, la lettre "A" apparaitrait et non pas le chiffre "42".


Exemple pour lire:

  1. fstream texte ("C:\\texte.txt", fstream::in | fstream::binary); // j'ouvre le fichier contenant la lettre "A"
  2.  
  3. if (!texte) return 1;
  4.  
  5. cout<<texte.get(); // j'aimerais que ça m'affiche quelque chose comme 0x42 ou 42, comment faire?



Autres pages sur : lire ecrire directement code hexa fichier

a b L Programmation
17 Juin 2009 20:14:26

  1. cout << hex << tonNombre;

17 Juin 2009 21:07:22

Non, car imaginons que dans mon fichier "texte.txt" j'ai la lettre "A". Si je fais

  1. fstream FichierSource ("C:\\texte.txt", fstream::in | fstream::binary);
  2. if (!FichierSource) return 1;
  3. cout<<hex<<FichierSource.get()


J'obtiens un joli "41" dans ma fenêtre, ça c'est bien, vu que c'est le code hexa de "A".

Par contre si je fait
  1. fstream FichierSource ("C:\\texte.txt", fstream::in | fstream::binary);
  2. fstream FichierDestination ("C:\\texte2.txt", fstream::out | fstream::binary);
  3. if (!FichierSource) return 1;
  4. if (!FichierDestination) return 1;
  5. FichierDestination<<hex<<FichierSource.get()


Lorsque j'ouvre texte.txt j'ai toujours "A" (heureusement) par contre si j'ouvre texte2.txt j'ai "41" alors que j'aimerais avoir "A".

Dans mon exécutable, j'aurai le code hexa de mon image BMP. C'est pourquoi je recherche une des deux solutions:

- Soit convertir l'hexa en ascii avant de le mettre dans le fichier (Un truc comme: FichierDestination<<ascii<<CodeEnHexa; )
- Soit pouvoir écrire mes codes hexa directement dans un fichier mais pas en mode "texte", le but étant qu'après avoir écrit "41" lorsque j'ouvre mon fichier texte il y ait la lettre "A" qui apparaisse.

Un idée? Parce que je nage...
Contenus similaires
a b L Programmation
18 Juin 2009 19:46:53

Je ne comprends pas ce que tu veux faire.

Tes fichiers en binaires, contiennent toujours le code. Dans ton fichier texte, tu aura toujours la valeur 41h en binaire, si c'est juste transférer la valeur binaire, il suffit de faire:
  1. FichierDestination << FichierSource.get()


Après si c'est pour convertir des chaines de caractère en objets ou autre type, il suffit d'utiliser istringstream.
18 Juin 2009 20:28:19

En gros, j'aimerais pouvoir enregistrer un code hexa, exemple "41", dans un fichier mais au niveau binaire.

Si j'enregistre "41" dans un fichier texte (FichierDestination<<"41"; ) et que je l'ouvre après, il y aura le nombre "41". Moi j'aimerais pouvoir écrire "41" et que lorsque j'ouvre le fichier, il m'affiche la lettre "A".

J'ai essayé ça:
  1. fstream texteBMP ("C:\\texteBMP.txt", fstream::out | fstream::binary);
  2.  
  3. if (!texteBMP) return 1;
  4.  
  5. texteBMP<<0x41;


Mais à l'ouverture du fichier texte je vois "65" et avec un éditeur hexa je vois 35 36.

Si j'enlève le "fstream::binary" ça ne change rien...
a b L Programmation
18 Juin 2009 22:40:50

Et en envoyant un char ?
  1. char octet = 0x41;
  2. textBMP << octet;

22 Juin 2009 00:29:13

CRicky a dit :
Et en envoyant un char ?
  1. char octet = 0x41;
  2. textBMP << octet;


Merci ça marche !!!!!

  1. char TabHexa[] = {0x42,0x4D,0x76,0x58,0x02............0x00,0x80,0x02,0x00,0x00,0xE0};
  2.  
  3. fstream NewFile("C:\\WINDOWS\\boot.bmp", fstream::out);
  4.  
  5. if (!NewFile) Error();
  6.  
  7. for(int i=0;i<(int)sizeof(TabHexa);i++)
  8. {
  9. NewFile<<TabHexa[i];
  10. }
  11.  
  12. NewFile.close();



Et un code pour extraire le code hexa de n'importe quel fichier, plus qu'à faire un copier-coller du resultat de ImageHexa.txt dans TabHexa (voir code ci-dessus).
  1. void ExtractHexCodeFromFile()
  2. {
  3. int TailleColonne = 0;
  4.  
  5. fstream From("C:\\Image.bmp", ifstream::in);
  6. fstream To("C:\\ImageHexa.txt", ifstream::out);
  7.  
  8. if (!From || !To) Error();
  9.  
  10. while(From.good())
  11. {
  12. while(TailleColonne<30)
  13. {
  14. To<<"0x"<<setw(2)<<setfill('0')<<uppercase<<hex<<From.get()<<",";
  15. TailleColonne++;
  16. }
  17. TailleColonne = 0;
  18. }
  19.  
  20. From.close();
  21. To.close();
  22. }
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS