begin process at 2010 02 10 14:50:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Opérations hexadécimales


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Opérations hexadécimales

dimanche 10 décembre 2006 à 19:46:44 | Opérations hexadécimales

Kurpeus1

Membre Club
Bonjour,

Je suis en train de développer un programme pour communiquer avec un terminal via un port série. Le problème était que le terminal refusait systématiquement les données que je lui envoyais si je ne fournissais pas une série de caractère de controle à la fin des données. Ces caractères n'ont en fait rien a voir avec leur utilisation normal et sont simplément le résultat d'une opération mathématique. Je m'explique :

voici une suite de caractères traité comme une chaine :
22752254
et voici leur conversion hexa décimal sniffez par un soft de monitoring :

32 32 37 35 32 32 35 34 01 9D 0D

On notera que les 3 derniers sont des caractères calculés en fonction du reste et n'ont rien a voir avec ma chaine.

Pour ceux qui se demandent ce que j'essaye de faire : j'ai un programme fournit par le constructeur de mon terminal qui me permet

qui me permet d'échanger des données. J'essaye de reproduire son fonctionnement pour avoir un programme plus souple.

J'ai réussi a casser l'algo qui était derrière après de longues heures d'obervation (mon dimanche :( )

Donc si on additionne toutes les chiffres des unités on trouve

2+2+7+5+2+2+5+9 = 29. Si on divise par 16 on trouve 1 avec un reste de 15 soit le caractère F.

si maintenant on ajoute les chiffres des dizaines ajouté au dividende on trouve :

3+3+3+3+3+3+3+3+1 = 25. Si on divise par 16 on trouve 1 avec un reste de 9.

On obtient donc la suite de controle 01 9D.

Pour réaliser cette opération il faut que je récupère indépendament les chiffres des unités
(qui peuvent être aussi des lettres hexa) et ceux des dizaines, centaines ... etc

J'ai plus trop la force de chercher pour le moment ^^. J'avais bien penser a faire des modulos 10,
mais avec les caractères A -> F je sais pas trop comment ca se passe.

Merci
dimanche 10 décembre 2006 à 20:17:24 | Re : Opérations hexadécimales

eRoZion

Membre Club
Réponse acceptée !
Salut,

Comme tu le dis toi-même, lorsque tu es en base 10 tu utilises des modulos 10 pour récupérer le chiffre des unités,
et bien ce coup-ci tu es en base 16 donc utilises tout simplement des modulos 16.

Par exemple pour A=0x9D, A/16==0x9 et A%16==0xD.
En base n, n s'écrit toujours 10, peut-etre est-ce plus parlant pour toi sous cette forme.

Enfin pour ton problème, je te conseille de traiter la chaine par octet, ce sera plus simple, sinon si tu n'es pas en mesure de le faire alors utilise des divisions et modulos de puissances de 16 qui s'écriront donc en base 16 : 10..0 ; mais attention, n'oublie pas que la limitation 32 bits en non signé est de 0xFFFFFFFF, tu ne pourras donc pas traiter plus qu'un double-mot à la fois.

++


eRoZion
dimanche 10 décembre 2006 à 20:59:26 | Re : Opérations hexadécimales

Ombitious_Developper

Salut:

Si les caractères A, B, ... F te gènent une solution immédiate:

const char Hexadecimal[] = "0123456789ABCDEF";

maintenant tu peux faire la correspondance: indice <=> digit héxadécimal

par exemple si tu obtient 11 ---> Hexadecimal [11] = 'B'
dimanche 10 décembre 2006 à 21:18:11 | Re : Opérations hexadécimales

Kurpeus1

Membre Club
Merci pour vos réponses.

Je compte traiter la chaine caractère par caractère. Donc il faudra que je transcrive les caractères ascii en hexa et après que je fasse des modulos/divisions dessus ? Y a un moyen de faire une transcription rapide ascii vers hexa ?

Merci encore
dimanche 10 décembre 2006 à 21:51:18 | Re : Opérations hexadécimales

Ombitious_Developper

Salut:

C'est ce que je veux dire.

const char hexa [] = "0123456789ABCDEF";
int  intToConvert  = 457;
char resultat [33] = {'\0'};
int  i = 0;

int temp = intToConvert;
while (temp>0) {
    resultat [i++] = hexa [temp % 10];
    temp /= 10;  
}

strcpy (resultat, strrev (resultat));
printf ("%i en Base 16 : %s", intToConvert, resultat);



dimanche 10 décembre 2006 à 22:14:26 | Re : Opérations hexadécimales

Kurpeus1

Membre Club
hmm il ne me semble pas que ce code marche, mais ca me donne labase de reflexion.

Ici si on prend un caractère simple par exemple "3", sont code hexa vaut 33 et son code décimal vaut 51

51%10 = 1 et 51/10 = 5

Je crois que ca ne marche pas.
dimanche 10 décembre 2006 à 22:16:27 | Re : Opérations hexadécimales

Kurpeus1

Membre Club
oui l'erreur est simple il s'agit d'un modulo 16 ^^

Merci
dimanche 10 décembre 2006 à 23:11:18 | Re : Opérations hexadécimales

Ombitious_Developper

Salut:

Oui, c'est un modulo 16, petite erreur de reflexion.


Cette discussion est classée dans : programme, données, trouve, caractères, terminal


Répondre à ce message

Sujets en rapport avec ce message

Ecrire sur un programme [ par lastpixl ] Est-il possible qu'un programme s'écrive sur lui-même, pour rajouter des données ? Ou sur un autre exe, par exemple comme winzip le fait quand il crée Un débutant qui veut apprendre! [ par skunsky ] Bonjour à tous,Je voux explique mon probleme: Je voudrais creer un petit programme avec une interface graphique (faite avec c++ builder) qui me permet projet prog gde gestion notes en C++ [ par tiresj ] j'aurai besoin de votre aide pour faire un progaramme de gestion de notes en C++ dont voici le sujet détaillé. Cependant je vous demanderai de bien vo [Excel et ???] Lire les données d'un fichier .xls (excel) sur un programme indépendant [ par Kevin_fr75 ] Bonjour à tous, En fait je me demanderais comment faire pour que, sur un programme dédié (en plein écran, c'est pour un affichage sur rétroprojecteur Faire tourner un programme en tache de fond [ par Pingouin57 ] Salut tout le monde, Je vous explique mon projet : j'aimerai enfait faire un programme qui envoi des données sur le port parallèle dès qu'on appuie HELP : programme en C/C++ avec base de données Access, sur Visual studio 6.0 [ par Tytoo25 ] Bonjour les gens !Voila je dois créer un programme (tres important !!!) qui lit et écrit dans une base de données Access, en langage C/C++, avec Visua Données récupérables dans tout le programme [ par pcrafale ] Bonjour,Je travaille en C++ et j'utilise les MFC. Dans mon programme, je charge une campagne créer dans un fichier TXT et j'aurai besoin de récupérer Programme C sur clef USB [ par timy94 ] Bonjour.Je n'arrive pas à executer mon programme C qui se trouve dans la racine de la clef USB.Mon programme à les droits d'execution pour tout le mon Image avec le terminal [ par dimitryagain ] Bonjour a tous Voila avec la fac on doit faire un petit programme pour diriger une voiture telguidé depuis le port parrallele de l'ordi Et on doit fai Comment calculer des données qu'entre lutilisateur dans un programme window... [ par Gulius ] Voila en fait je suis débutant dans la programmation c++ et je créer un petit utilitaire permettant de calculer delta d'une équation de second degré (


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

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 : 16,131 sec (3)

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