Opérations hexadécimales

Résolu
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 10 déc. 2006 à 19:46
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 10 déc. 2006 à 23:11
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

7 réponses

cs_eRoZion Messages postés 241 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 8 octobre 2007 1
10 déc. 2006 à 20:17
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
3
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
10 déc. 2006 à 20:59
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'
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
10 déc. 2006 à 21:18
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
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
10 déc. 2006 à 21:51
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);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
10 déc. 2006 à 22:14
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.
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
10 déc. 2006 à 22:16
oui l'erreur est simple il s'agit d'un modulo 16 ^^

Merci
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
10 déc. 2006 à 23:11
Salut:

Oui, c'est un modulo 16, petite erreur de reflexion.
0
Rejoignez-nous