1 2 3 4 5 6 7 8 9 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#include <stdio.h>
#include <math.h>
#include <windows.h>
// Méthode simple de conversion (sans vérification !)
// '0' représente le premier caractère (selon la table ascii) qui est un nombre
// Sa valeur est 48, si par exemple nous avons '1' (qui vaut 49)
// '1' - '0' = 1 ( 49 - 48 = 1 )
int NombreASCII_2_Entier( char ascii ) {
return ascii - '0';
}
// Méthode de conversion de base : http://visualcplus.blogspot.com/2006/03/hexadecimal-2-decimal.html
int ConvertionBase( int nombre, int baseOrigine, int baseFinal ) {
int entier = 0,
lenHexa = log10( (double)nombre );
for( int i = 0; i < lenHexa + 1; i++ ) {
int dizaines = pow((double)baseFinal,lenHexa - i);
entier += (int)(nombre / dizaines) * pow( (double)baseOrigine, lenHexa - i );
nombre %= dizaines;
}
return entier;
}
int main() {
char chaineHexa[] = "646576656c6f7070657a2e6e6574";
char tmpStrHexa[2];
char tmpChar;
int lenChaineHexa = strlen( chaineHexa ), q = 0;
char buffer[(lenChaineHexa/2) * sizeof(char) +1];
if (buffer != NULL)
{
for( int i = 0; i < lenChaineHexa; i += 2 ) {
// Copie les deux caractères selon la position actuel
// chaineHexa + i est équivalent à chaineHexa[i]. Ici j'utilise l'adition étant donnée
// que chaineHexa est à la base qu'une simple adresse en mémoire, et que nous voulons
// l'adresse du Nième élément (ou N est la variable i ici)
memcpy( tmpStrHexa, chaineHexa + i , sizeof( *chaineHexa ) * 2 );
// Convertie le code ASCII en entier
tmpChar = NombreASCII_2_Entier( tmpStrHexa[0] ) * 10 + NombreASCII_2_Entier( tmpStrHexa[1] );
// Convertie la valeur hexa (entrée par l'utilisateur) en entier
tmpChar = ConvertionBase( tmpChar, 16, 10 );
printf("--> %c%c --> %c\n", tmpStrHexa[0], tmpStrHexa[1], tmpChar);
// %c affiche un caractère
//printf("%c\n", tmpChar );
buffer[q] = tmpChar;
q++;
}
buffer[q] = '\0';
printf("Text: %s\n", buffer);
}
} |
Partager