begin process at 2012 02 12 12:25:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CONVERSION DEC / HEX / BIN (WIN 32)

CONVERSION DEC / HEX / BIN (WIN 32)


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :conversion, hexadécimal, binaire, décimal, base Niveau :Débutant Date de création :14/07/2003 Date de mise à jour :09/05/2007 15:40:26 Vu / téléchargé :24 595 / 469

Auteur : aardman

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


 Description

Bon, je sais qu'il y a deja pas mal de sources sur ces conversions, j'aporte juste une "interface graphique" avec ce prog, si on peut appeller ca comme ca.

Source

  • #include <windows.h>
  • #include "resource.h"
  • //----------------------------------------------------------------------------------
  • // variables globales
  • //----------------------------------------------------------------------------------
  • static HWND hDec;
  • static HWND hHex;
  • static HWND hBin;
  • static WNDPROC pOldEditProc;
  • // char to int table
  • static char c2i_table[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  • 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
  • 0,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, 0, 0, 0, 0, 0,
  • 0,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, 0, 0, 0, 0, 0,
  • 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  • 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  • 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  • 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  • // int to char table
  • static char i2c_table[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  • //----------------------------------------------------------------------------------
  • // base
  • // - inbase : entre 2 et 16
  • // - outbase : entre 2 et 16
  • //----------------------------------------------------------------------------------
  • char* base(char* number, int inbase, int outbase)
  • {
  • char* p = NULL;
  • char* b = NULL;
  • unsigned __int64 nb = 0;
  • static char buff[128];
  • // évalue number
  • for(p = number; *p != '\0'; p++)
  • {
  • nb *= inbase;
  • nb += c2i_table[*((unsigned char*)p)];
  • }
  • // écrit le nombre convertis dans buff
  • for(p = buff; nb > 0; p++)
  • {
  • *p = i2c_table[nb % outbase];
  • nb /= outbase;
  • }
  • // retourne la chaine
  • for(b = buff, *p-- = '\0'; b < p; b++, p--)
  • {
  • char tmp = *b;
  • *b = *p;
  • *p = tmp;
  • }
  • return buff;
  • }
  • //----------------------------------------------------------------------------------
  • // UpdateContent
  • //----------------------------------------------------------------------------------
  • void UpdateContent(HWND hEdit, int inbase)
  • {
  • char buff[128];
  • GetWindowText(hEdit, buff, 128);
  • switch(inbase)
  • {
  • case 2:
  • SetWindowText(hDec, base(buff, 2, 10));
  • SetWindowText(hHex, base(buff, 2, 16));
  • break;
  • case 10:
  • SetWindowText(hBin, base(buff, 10, 2));
  • SetWindowText(hHex, base(buff, 10, 16));
  • break;
  • case 16:
  • SetWindowText(hBin, base(buff, 16, 2));
  • SetWindowText(hDec, base(buff, 16, 10));
  • break;
  • }
  • }
  • //----------------------------------------------------------------------------------
  • // EditProc
  • //----------------------------------------------------------------------------------
  • LRESULT CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • if(uMsg == WM_CHAR)
  • {
  • WPARAM key = wParam;
  • // autorise copier/coller + effacer
  • if(key == 0x03 || key == 0x16 || key == VK_BACK) goto defproc;
  • // n'autorise que certains caracteres
  • if(hWnd == hDec) // 01234567890
  • {
  • if(key >= '0' && key <= '9') goto defproc;
  • return 0;
  • }
  • else if(hWnd == hHex) // 0123456789 abcdef ABCDEF
  • {
  • if((key>= '0' && key <= '9') || (key >= 'a' && key <= 'f') || (key >= 'A' && key <= 'F')) goto defproc;
  • return 0;
  • }
  • else if(hWnd == hBin) // 01
  • {
  • if(key != '0' && key != '1') return 0;
  • }
  • }
  • defproc:
  • return CallWindowProc(pOldEditProc, hWnd, uMsg, wParam, lParam);
  • }
  • //----------------------------------------------------------------------------------
  • // AppDlgProc
  • //----------------------------------------------------------------------------------
  • INT_PTR CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  • {
  • switch(uMsg)
  • {
  • case WM_INITDIALOG:
  • {
  • // editbox
  • hDec = GetDlgItem(hDlg, IDC_DEC);
  • hHex = GetDlgItem(hDlg, IDC_HEX);
  • hBin = GetDlgItem(hDlg, IDC_BIN);
  • SendMessage(hDec, EM_SETLIMITTEXT, 20, 0);
  • SendMessage(hHex, EM_SETLIMITTEXT, 16, 0);
  • SendMessage(hBin, EM_SETLIMITTEXT, 64, 0);
  • // sous classement
  • pOldEditProc = (WNDPROC)(LONG_PTR) SetWindowLong(hDec, GWL_WNDPROC,(LONG)(LONG_PTR) EditProc);
  • SetWindowLong(hHex, GWL_WNDPROC,(LONG)(LONG_PTR) EditProc);
  • SetWindowLong(hBin, GWL_WNDPROC,(LONG)(LONG_PTR) EditProc);
  • // focus
  • wParam = (WPARAM) hBin;
  • }
  • return TRUE;
  • case WM_COMMAND:
  • switch(wParam)
  • {
  • // update texte des edits
  • case MAKEWPARAM(IDC_DEC, EN_CHANGE):
  • if(hDec == GetFocus()) UpdateContent(hDec, 10);
  • return FALSE;
  • case MAKEWPARAM(IDC_HEX, EN_CHANGE):
  • if(hHex == GetFocus()) UpdateContent(hHex, 16);
  • return FALSE;
  • case MAKEWPARAM(IDC_BIN, EN_CHANGE):
  • if(hBin == GetFocus()) UpdateContent(hBin, 2);
  • return FALSE;
  • case IDCANCEL:
  • EndDialog(hDlg, 0);
  • return FALSE;
  • }
  • }
  • return FALSE;
  • }
  • //----------------------------------------------------------------------------------
  • // WinMain
  • //----------------------------------------------------------------------------------
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  • {
  • DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, AppDlgProc, 0);
  • return 0;
  • }
#include <windows.h>
#include "resource.h"


//----------------------------------------------------------------------------------
// variables globales
//----------------------------------------------------------------------------------
static HWND hDec;
static HWND hHex;
static HWND hBin;
static WNDPROC pOldEditProc;

// char to int table
static char c2i_table[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
                           0,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, 0, 0, 0, 0, 0,
                           0,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, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

// int to char table
static char i2c_table[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};


//----------------------------------------------------------------------------------
// base
// - inbase : entre 2 et 16
// - outbase : entre 2 et 16
//----------------------------------------------------------------------------------
char* base(char* number, int inbase, int outbase)
{
	char* p = NULL;
   char* b = NULL;
	unsigned __int64 nb = 0;

	static char buff[128];

	// évalue number
	for(p = number; *p != '\0'; p++)
	{
		nb *= inbase;
      nb += c2i_table[*((unsigned char*)p)];
	}

	// écrit le nombre convertis dans buff
	for(p = buff; nb > 0; p++)
	{
		*p = i2c_table[nb % outbase];
		nb /= outbase;
	}

	// retourne la chaine
	for(b = buff, *p-- = '\0'; b < p; b++, p--)
	{
		char tmp = *b;
		*b = *p;
		*p = tmp;
	}
	return buff;
}


//----------------------------------------------------------------------------------
// UpdateContent
//----------------------------------------------------------------------------------
void UpdateContent(HWND hEdit, int inbase)
{
	char buff[128];

   GetWindowText(hEdit, buff, 128);

	switch(inbase)
	{
	case 2:
		SetWindowText(hDec, base(buff, 2, 10));
		SetWindowText(hHex, base(buff, 2, 16));
		break;
	case 10:
		SetWindowText(hBin, base(buff, 10, 2));
		SetWindowText(hHex, base(buff, 10, 16));
		break;
	case 16:
		SetWindowText(hBin, base(buff, 16, 2));
		SetWindowText(hDec, base(buff, 16, 10));
		break;
	}
}


//----------------------------------------------------------------------------------
// EditProc
//----------------------------------------------------------------------------------
LRESULT CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if(uMsg == WM_CHAR)
	{
		WPARAM key = wParam;

		// autorise copier/coller + effacer
		if(key == 0x03 || key == 0x16 || key == VK_BACK) goto defproc;

		// n'autorise que certains caracteres
		if(hWnd == hDec) // 01234567890
		{
			if(key >= '0' && key <= '9') goto defproc;
			return 0;
		}	
		else if(hWnd == hHex) // 0123456789 abcdef ABCDEF
		{
			if((key>= '0' && key <= '9') || (key >= 'a' && key <= 'f') || (key >= 'A' && key <= 'F')) goto defproc;
			return 0;
		}
		else if(hWnd == hBin) // 01
		{
			if(key != '0' && key != '1') return 0;
		}
	}
defproc:
   return CallWindowProc(pOldEditProc, hWnd, uMsg, wParam, lParam);
}


//----------------------------------------------------------------------------------
// AppDlgProc
//----------------------------------------------------------------------------------
INT_PTR CALLBACK AppDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg) 
	{
	case WM_INITDIALOG:
		{
			// editbox
			hDec = GetDlgItem(hDlg, IDC_DEC);
			hHex = GetDlgItem(hDlg, IDC_HEX);
			hBin = GetDlgItem(hDlg, IDC_BIN);
			SendMessage(hDec, EM_SETLIMITTEXT, 20, 0);
			SendMessage(hHex, EM_SETLIMITTEXT, 16, 0);
			SendMessage(hBin, EM_SETLIMITTEXT, 64, 0);

			// sous classement
			pOldEditProc = (WNDPROC)(LONG_PTR) SetWindowLong(hDec, GWL_WNDPROC,(LONG)(LONG_PTR) EditProc);
			SetWindowLong(hHex, GWL_WNDPROC,(LONG)(LONG_PTR) EditProc);
			SetWindowLong(hBin, GWL_WNDPROC,(LONG)(LONG_PTR) EditProc);

         // focus
         wParam = (WPARAM) hBin;
		}
		return TRUE;

   case WM_COMMAND:
		switch(wParam) 
		{
      // update texte des edits
		case MAKEWPARAM(IDC_DEC, EN_CHANGE):
			if(hDec == GetFocus()) UpdateContent(hDec, 10);
			return FALSE;
		case MAKEWPARAM(IDC_HEX, EN_CHANGE):
			if(hHex == GetFocus()) UpdateContent(hHex, 16);
			return FALSE;
		case MAKEWPARAM(IDC_BIN, EN_CHANGE):
			if(hBin == GetFocus()) UpdateContent(hBin, 2);
			return FALSE;

		case IDCANCEL:
			EndDialog(hDlg, 0);
         return FALSE;
		}
	}
   return FALSE;
}


//----------------------------------------------------------------------------------
// WinMain
//----------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, AppDlgProc, 0);
	return 0;
}

 Conclusion

L'executable est dans le repertoire release,  il faut renomer le fichier .ex_ en .exe.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

13 août 2004 22:14:58 :
nouvelle version
13 août 2004 22:19:14 :
petit oubli
15 octobre 2005 18:43:24 :
prog refais, gere les conversions de nombres sur 64 bits.
09 mai 2007 15:40:26 :
correction bug

 Sources du même auteur

Source avec Zip EDONKEY SEARCHER (SOCKET, WIN32)
Source avec Zip FONCTIONS IMPORTÉES/EXPORTÉES D'UN EXECUTABLE (WIN32)
Source avec Zip TÉLÉCHARGER UN FICHIER (WIN32, SOCKETS)
Source avec Zip DES YEUX (WIN32)
Source avec Zip Source avec une capture DES CHIFFRES ET DES LETTRES (WIN32)

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

TECHNIQUE SIMPLE DE CONVERSION BINAIRE DÉCIMAL par DarthKhaos
CONVERSION D'ENTIERS DANS LES BASES BINAIRE, HEXADECIMALE, O... par alyggattor
Source avec Zip Source avec une capture CONVERSION D'UN NOMBRE D'UNE BASE QUELCONQUE VERS UNE AUTRE par Abrahamz
Source avec Zip Source avec une capture CONVERTISSEUR BINAIRE, HÉXA, DÉCIMAL UTILISANT LES API WINDO... par julien_boss
AFFICHAGE EN BASE 2 D'UN NOMBRE DONNÉ EN BASE 10 par kanagan

Commentaires et avis

Commentaire de dekkatlon le 19/07/2003 23:53:15

Programme intéressant, j'ai noté un bug suite aux limitations dans la saisie des cars, par exemple si on saisie 'P' dans la zone décimale on a bien un message d'erreur mais le 'P' est quand même intégré dans la zone d'édition. Pour éviter çà on peut ajouter après les MessageBox le code suivant:
*p = '';
SetDlgItemText(hDlg, IDC_DEC, szBufToCheck);

idem pour IDC_HEX et IDC_BIN

Commentaire de aardman le 20/07/2003 00:40:51

Salut,

En effet j'avais deja essayé de resoudre ce probleme, en essayant d'envoyer un message WM_UNDO au control pour effacer la derniere saisie, mais ca m'avait apporte plein d'autres problemes donc j'avais abandonné cette idée.

Sinon pour ta méthode, c'est une bonne idée mais:

1) *p = '' ne se compile pas chez moi (encore ca c'est pas grave, suffit de faire une fonction qui efface le *p actuel et décale la chaine de caractere d'un caractère).
2) A chaque notification de message EN_UPDATE je teste le focus pour savoir si c'est une update de l'USER ou si c'est une update du programe lui meme. Utiliser la fonction SetDlgItemText juste apres la MessageBox genererait une boucle infinie de message EN_UPDATE car le control à le focus (donc plantage).

Pour resoudre ce probleme je crois qu'il faudrais que je revois entierement la structure du prog.

merci encore pour le commentaire!

Commentaire de aardman le 28/08/2003 22:42:17

Probleme résolu grace au sous classement des edit-box.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

conversion binaire-décimal en C [ par Tooshort23 ] Bonjour,je suis étudiant en IUT GEII.Savais vous convertir un nombre binaire (de taille: 32 bits) en décimal ?merci de me donner des conseils.Si possi Bis: Binaire en C [ par fredleconte ] Réponse acceptée ! Mon problème n'est pas de convertir un nombre d'un base a l'autre mais de l'écrire comme en basic "%1010101" ou "%" désigne un nomb conversion decimal - binaire [ par diabablo ] slt les amisj'aime la programmation mais pour debuter j'ai un peu de soucis tel que la conversion d'un nombre decimal en binaire. en faite ce n'est pa Conversion binaire -> Texte [ par milanoran ] Bonjour j'ai un petit problème avec une application sous visulen c++ 6.0 qui nécessite une conversion binaire -> caractère . pour être plus précis j conversion binaire vers float rs-232 [ par zilot2 ] bonjours et pardonnez mon français: j'ai un projet pic16f qui consiste a envoyer un nombre float au port rs-232 puis je l'affiche sur pc.mon probleme conversion hexadecimal-binaire [ par naddoush ] salut tout le monde, je voudrais bien faire une conversion de l'hexadecimal en binaire, y a-t-il une fonctio que me permet de faire ça? je travaille Conversion Binaire->Chaine et Chaine->Binaire [ par Rouliann ] Bonjour &#224; tous!Voil&#224; mon probl&#232;me : je veux convertir une couleur de 24 bits en une couleur 15bits...Le seul moyen que j'ai trouv&#233; convertir un float en binaire [ par tiess81 ] Bonjour je suis en train de concevoir un interpreteur avec flex et bison qui doit me permettre de faire des calculs arithm&#233;tique dans toutes les Conversion chaine binaire en float, double... [ par renyone ] Bonjour, j'ai une chaine binaire (de 32 bits par exemple) et j'aimerais obtenir le float (ou double...) qu 'elle représente; Y a-t-il des fonctions dé Conversion d'entier en base 2^32 vers base 10 [ par le_duche ] Bonjour !Je chercher je cherche, mais je ne trouve pas d'idée.Dans le cadre de l'implémentation d'une classe de grands entiers, je souhaite pouvoir co


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales