Opérations hexadécimales [Résolu]

Signaler
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007
-
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
-
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

Messages postés
241
Date d'inscription
vendredi 23 mai 2003
Statut
Membre
Dernière intervention
8 octobre 2007
1
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
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
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'
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

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
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
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);
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

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.
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

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

Merci
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut:

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