Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[C++] BASE64CONVERTER V1.1, UN ENCODEUR DÉCODEUR EN BASE64


Information sur la source

Catégorie :Maths & Algorithmes Classé sous : base64, décoder, encoder, conversion, fichiers Niveau : Initié Date de création : 26/12/2006 Date de mise à jour : 28/12/2006 15:18:32 Vu / téléchargé: 11 416 / 604

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Ce logiciel décode ou encode des chaînes de caractères ou des fichiers en base 64, un système qui convertit des données binaires en données texte (pour les mails).
Je n'en ai pas trouvé sur internet qui encode ET décode (un seul qui décode) donc je vous en fais profiter :).
J'ai conservé le code de base64.sourceforge.net, qui convertit à la fois les strings et les fichiers.
________________________________________

La version 1.0 traitait une façon originale de faire des threads, mais elle se révélait trop lente (et en réalité ce n'étaient pas des threads). Et l'appli était assez lourde (300ko) à cause des librairies STL. J'ai donc tout refait en C avec de vrais thread lancés avec _beginthread... Ca donne une petite appli de 41 Ko !
________________________________________

Ce code va me servir avant tout à créer un logiciel pour envoyer ou lire des emails avec ou sans pièce jointe, et comme le protocole MIME le veut, les pièces jointes sont encodées en base64 ou UUEncode.

Joyeux noël à tous !
 

Source

  • // Je laisse volontairement l'ancien code pour ceux qui n'ont pas vu la source 1.0
  • // URL de la source 1.0 : http://ordiman85.free.fr/logiciels/sources/Base64Converter%20v1.0%20-%20Source.zip
  • //
  • // Attention Ce code n'a plus aucun rapport avec le code de la version 1.1 !
  • //
  • // Pour les tâches d'arrière-plan
  • //
  • // Une alliance en une boîte de dialogue et la fonction PeekMessage
  • // Variable définissant la tâche d'arrière-plan à lancer
  • int CallBackJob = 0;
  • MSG msg;
  • // CreateDialog est non-bloquante, on doit donc lancer GetMessage ou PeekMessage
  • HWND hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc);
  • // Boucle (presque) infinie (terminée par return 0;)
  • for (;;)
  • {
  • // Traite tous les messages
  • while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  • {
  • // Si le programme veut quitter
  • if (msg.message == WM_QUIT)
  • return 0;
  • // Traitement dans Dialogproc
  • TranslateMessage(&msg);
  • DispatchMessage(&msg);
  • }
  • // Arrivé ici, il n'y a plus de messages, donc on peut continuer la tâche d'arrière-plan
  • // Choisit la tâche à effectuer selon la variable CallBackJob définie auparavant
  • switch (CallBackJob)
  • {
  • case JOB_ENCODE:
  • OnEncode(hWnd);
  • break;
  • case JOB_DECODE:
  • OnDecode(hWnd);
  • break;
  • default:
  • // Attend un message
  • WaitMessage();
  • break;
  • }
  • }
// Je laisse volontairement l'ancien code pour ceux qui n'ont pas vu la source 1.0
// URL de la source 1.0 : http://ordiman85.free.fr/logiciels/sources/Base64Converter%20v1.0%20-%20Source.zip
//
// Attention Ce code n'a plus aucun rapport avec le code de la version 1.1 !
//
// Pour les tâches d'arrière-plan
// 
// Une alliance en une boîte de dialogue et la fonction PeekMessage

// Variable définissant la tâche d'arrière-plan à lancer
int CallBackJob = 0;
MSG msg;
// CreateDialog est non-bloquante, on doit donc lancer GetMessage ou PeekMessage
HWND hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc);
// Boucle (presque) infinie (terminée par return 0;)
for (;;)
{
  // Traite tous les messages
  while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  {
    // Si le programme veut quitter
    if (msg.message == WM_QUIT)
      return 0;
    // Traitement dans Dialogproc
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  // Arrivé ici, il n'y a plus de messages, donc on peut continuer la tâche d'arrière-plan
  // Choisit la tâche à effectuer selon la variable CallBackJob définie auparavant
  switch (CallBackJob)
  {
    case JOB_ENCODE:
      OnEncode(hWnd);
      break;
    case JOB_DECODE:
      OnDecode(hWnd);
      break;
    default:
      // Attend un message
      WaitMessage();
      break;
  }
}

Conclusion

Version 1.1, prête à compiler avec Code::Blocks
Logiciel disponible sur http://ordiman85.free.fr/

Si vous trouvez des bugs ou des erreurs, ça donnera lieu à des corrections, promis !

Joyeux noël à tous et bonne année ;)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

28 décembre 2006 14:58:03 :
Version 1.1 : retapé en C, gestion des threads ajouté (+ rapide et + léger -> 41Ko)
28 décembre 2006 15:18:32 :
maj (petite correction)

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 26/12/2006 12:23:22 administrateur CS

Encoder et décoder dans un thread n'irait pas au moins aussi bien ?

signaler à un administrateur
Commentaire de vecchio56 le 26/12/2006 13:52:28 administrateur CS

C'est vrai qu'on n'a pas l'habitude de voir ce genre de méthodes
Ca a l'intérêt de montrer une alternative aux threads, mais c'est très certainement moins efficace (par exemple, si on déplace la fenêtre pendant le traitement, ca bloque le traitement)

Avec quel compilateur as-tu obtenu ton exécutable? (J'essaie de comprendre comment il peut faire 300Ko)

signaler à un administrateur
Commentaire de Arnaud16022 le 26/12/2006 17:52:43

C'est dit, C::B -> on peut raisonnablement supputer MingW ... décoche " inclure les symboles de débug "
Sinon oui, porquoi pas de threads ? ça serait quand même plus simple je pense

signaler à un administrateur
Commentaire de vecchio56 le 26/12/2006 18:41:14 administrateur CS

Je pense pas qu'il a utilisé MinGW parce que j'ai fait un strip sur l'exe et ca fait rien
J'imagine avec Code::Blocks on peut utiliser n'importe quel compilateur

signaler à un administrateur
Commentaire de Arnaud16022 le 26/12/2006 19:16:08

oui oui C::B gère une bonne dizaine de compilos (même un compilo D ^^ ) Mais bon, l'install par défaut est avec mingW, donc c'est pour ça .
bon, je tente le coup et je vous dis

signaler à un administrateur
Commentaire de Arnaud16022 le 26/12/2006 19:22:33

Bon au mini j'arrive à 280 Kos, c'est louche.
Je soupçonne commctrl.h, qu'en disent les autres ?

signaler à un administrateur
Commentaire de BruNews le 26/12/2006 19:34:35 administrateur CS

#include <process.h> // Threads
#include <string> // chaines de caractères
#include <iostream> // Fichiers
#include <fstream> // Fichiers
#include <stdio.h>
c'est d'abord tout cela que je commencerai à virer, mais bon...

Me semble évident aussi que pour faire du code Windows j'utilise un compilo MS, si toute la misère du monde m'obligeait un jour à faire du Linux j'emploierais bien entendu les outils dédiés.

signaler à un administrateur
Commentaire de Kirua le 27/12/2006 10:56:33

Dès que tu utilises la STL ton exe passe à 480 KO, et avec un strip tu descends à 240 Ko quand tu utilises G++ (sous win en tt cas). C'est ça, la magie des hello world :).

Sinon, c'est splendide que ce code arrive pile mtnt: j'ai 3 fenêtres ouvertes pour écrire mon encodeur base64 depuis 3 jours et pas le temps (blocus). J'irai lire ton code ... après le petit dèj' (ce qui peut expliquer pourquoi j'ai pas le temps de l'écrire moi-même).

signaler à un administrateur
Commentaire de Kirua le 27/12/2006 11:07:38

Hmm, c'est quand même assez sale d'avoir une partie des fonctions dans le main et l'autre partie dans deux fichiers séparés, selon le type de source de données. Sans compter le "OnEndConversion(hDlg);" dans les méthodes de conversion de fichiers. C'est pas super propre quoi :)

Je comprends bien le souci ceci dit: tu peux pas charger tout le fichier en mémoire au cas où il serait gros, mais tu peux pas donner le fichier bout par bout à la méthode de conversion de chaines parce qu'elle effectue un traitement de "fin". Mais ce que tu peux faire, c'est ajouter un paramètre optionnel aux méthodes séparées (les propres ^^):

std::string Base64Encode(const std::string& data, bool finalize = true);
std::string Base64Decode(const std::string& data, bool finalize = true);

(remarque que j'ai mis des const std::string& au lieu de string: ça évite de les copier inutilement tout en se prémunissant contre les modifs des données originales).

Si finalize est mis à false, l'algo n'effectue pas la partie de "finalisation" d'un encodage en base 64. Ça te permet d'appeler la fonction sur des bouts de chaîne du fichier et de les concaténer. Tu mets finalize à true uniquement pour le dernier bout.

Il est possible qu'il y ait aussi un début spécial, je ne sais plus. Mais un truc identique devrait fonctionner:

enum {START = 1, CENTER = 2, END = 4}

et par défaut, le paramètre serait: int pos = START | END.

Sais pas trop si c'est clair, mais en tout cas, il FAUT n'avoir la conversion base64 qu'à un seul endroit, ça c'est clair ^^.

signaler à un administrateur
Commentaire de ordiman85 le 27/12/2006 17:27:55

BruNews :
Encoder et décoder dans un thread n'irait pas au moins aussi bien ?

J'avoue que les threads sont peut-être la meilleure solution, mais je voulais essayer d'autres méthodes qui prennent moins de performances mais il est vrai que déplacer la fenêtre ralentit le processus.
______________________

vecchio56 :
Avec quel compilateur as-tu obtenu ton exécutable?

J'utilise CNU GCC Compiler (par défaut dans Code::Blocks)
______________________

vecchio56 :
J'essaie de comprendre comment il peut faire 300Ko

Je l'ignore je suis moi-même surpris ! L'exécutable comprend gdi32.a, user32.a, kernel32.a, comctl32.a, un fichier .rc, une icône (25ko), le manifest (656o) et le code...
______________________

Arnaud16022 :
décoche " inclure les symboles de débug "

C'est fait...
______________________

Arnaud16022 :
Je soupçonne commctrl.h, qu'en disent les autres ?

Les headers ne prennent aucune place dans l'exécutable, ce ne sont que des déclarations de fonctions ou des #define (enfin d'après ce que je sais)
______________________

Kirua :
C'est pas super propre quoi :)

Dsl, j'ai appris à programmer tout seul et ça ne fait pas longtemps que je programme en C++ (et encore j'ai fait des progrès !).
Je vais apprendre petit à petit à structurer mes logiciels sans me précipiter comme je l'ai fait jusqu'ici (ça fait même pas une semaine que je suis sur ce projet)

______________________

Kirua :
Il est possible qu'il y ait aussi un début spécial

Non il n'y en a pas, ce qu'il y a, c'est qu'il faut encoder bloc par bloc (blocs de 3 pour donner des blocs de 4 d'où l'augmentation de la taille par 33%).
Sinon bonne idée pour le finalize !! Je prendrais plutôt le code de base64.sourceforge.net qui me semble adapté à la fois pour les fichiers et les strings.

______________________

Kirua :
Sais pas trop si c'est clair, mais en tout cas, il FAUT n'avoir la conversion base64 qu'à un seul endroit, ça c'est clair ^^.

Je suis d'accord ! Ca allégerait certainement le programme.

______________________

Je ne pensais pas que ce programme ferait autant de bruit... J'avoue que les codeurs décodeurs base64 en C, C++ ne sont pas très nombreux ici.
Allez je vais faire des efforts encore, bonnes fêtes à tous !

@+

signaler à un administrateur
Commentaire de ordiman85 le 27/12/2006 17:38:08

Je vais essayer de refaire le programme en C, ça va peut-être me faire gagner une centaine de ko...
Dites-moi ce que vous en pensez, pendant ce temps, je me lance (en essayant de faire + propre)

@+

signaler à un administrateur
Commentaire de Kirua le 27/12/2006 18:39:27

La taille de ton programme vient exclusivement de l'utilisation des bibliothèques STL: sitôt que tu inclus iostream, string, vector, list, queue, stack, map, algorithm ................: n'importe lequel de ces olibrius, ton exe passe à 450 Ko sans l'option "strip". Si tu tiens à faire un petit exe, il faut t'en passer (c'est chiant ^_^). Dans la majorité des cas, on s'en tamponne pas mal que l'exe soit gros, et du reste: la fonction base64 toute seule ne "pèse" rien. Il y a deux cas de figure:

* soit tu as besoin d'un petit exe et tu l'adaptes pour utiliser des char* et des FILE plutôt que des string et des fstream

* soit tu utilises la fonction avec un programme qui inclus déjà la STL, auquel cas ça n'aura aucune incidence sur la taille de l'exe.

signaler à un administrateur
Commentaire de ordiman85 le 27/12/2006 20:15:21

Merci pour vos remarques ^^ ici ce qui m'intéresse c'est de faire une toute petite appli donc il vaut mieux que je la fasse en C.

En effet ce sont les bibliothèques stl qui alourdissent le programme !! En C le nouveau programme compilé (partiellement codé) occupe à peine une quarantaine de Ko. Merci encore ! :)

@+

signaler à un administrateur
Commentaire de katsankat le 25/06/2007 15:05:58

Salut, aujourd'hui c'est bien conçu, de façon modulaire avec des objets faciles à réemployer, le code est suffisamment commenté, ça fonctionne et c'est facile à porter sur linux -> j'ai mis 9.

signaler à un administrateur
Commentaire de ordiman85 le 26/08/2007 21:04:32

Si tu as un peu de temps dis moi comment je pourrais le faire porter sur linux au niveau des fenêtres et des contrôles ça m'intéresse vu que je vais surement passer sous linux bientot...
Merci d'avance
@+

signaler à un administrateur
Commentaire de katsankat le 27/08/2007 09:48:37

Tu pourrais le développer dès aujourd'hui sous windows avec GTK+. Très rapide à développer car le code GTK+ est nettement plus simple que la programmation win32. Garder le module base64 et virer le reste. Si tu veux je te passe une ossature de fenêtre qui ressemble.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

conversion de fichiers en C. [ par primo177 ] Bonjour tout le monde.J'aimerais savoir svp s'il existe un moyen de convertir un fichier word ( .doc) en uin fichier (.txt).Merci d'avance.C'est vraim conversion de fichiers [ par sergio18 ] salutJe fais un projet où je dois faire une conversion du fichier.POur cela le prof qui me suit m'a demandé d'effectuer ds un premier temps une lectur Codage Base64 en C [ par jcf1981 ] Bonjour je cherche une fonction C pour d&#233;coder une chaine de caract&#232;re en base64 . Pour la coder en PHP , pas de soucis mais pour la d&#23 Client/serveur Socket transfert de plusieurs fichiers [ par atifelkhachine ] Bonjour.quelqu'un peut me donner un pti guide pour realiser une application C/S de transfert de plusieurs fichiers binaires en utilsant les sockets . Précision sur les include [ par buno ] Salut les gens!J'aimerais avoir quelques petites pr&#233;cisions sur les fichiers que l'on inclus, notamment, j'aurais deux questions:- la premi&#232; Code Client/Server et envoi plusieurs fichiers ... [ par QuakeCoder ] Bonjour, Apr&#232;s des efforts j'ai r&#233;alis&#233; une petite application Client/Server qui sert &#224; transf&#233;rer plusieurs fichiers du clie En-tête de fichiers [ par lisandru ] Bonjour, Alors voila mon problème.Je voudrais savoir si il est possible d'insérer un en-tête dans un fichier sans avoir forcement a insérer l'en-tête fichiers [ par marianna2005 ] slt .j ai un grooooooooooos probleme et je veux de l aide: je fais un stage ds une societe de devloppement informatique.mon sujet est de faire un prog Fichiers en ressources - API Windows [ par banane_rose ] salut voil&#224; je voudrais savoir comment mettre des fichiers en ressources du programmes puis apr&#232;s pouvoir les enregistrer apr&#232;s (dialo !!! Petit sondage !!! [ par yoyo269 ] Alors voil&#224;. Je souhaite vous sonder (en tout bien tout honneur bien s&#251;r) sur une source &#224; d&#233;poser ou non. Il y a qq temps j'ai pr


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,780 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.