Epractical Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 Bonjour, Je dois rendre un projet pour demain, il s'agit du cryptage RSA, mon projet est terminé mais je n'arrive pas à coder tous les caractères faisants partis du code ASCII étendu. J'utilise visual C++ et pour récupérer le code ASCII j'utilise ceci : int code_ascii; char caract; code_ascii = (long) caract; Qu'y a t il comme solution pour récupérer le véritable Code ASCII étendu (et non pas par exemple -23 pour le "é" ? Merci par avance, William Lien vers le commentaire Partager sur d’autres sites More sharing options...
Shtong Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 quel est l'encodage de ta chaîne de caractères à la base ? UTF8 ? ISO-Machin ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 Bonjour,Je dois rendre un projet pour demain, il s'agit du cryptage RSA, mon projet est terminé mais je n'arrive pas à coder tous les caractères faisants partis du code ASCII étendu. J'utilise visual C++ et pour récupérer le code ASCII j'utilise ceci : int code_ascii; char caract; code_ascii = (long) caract; Qu'y a t il comme solution pour récupérer le véritable Code ASCII étendu (et non pas par exemple -23 pour le "é" ? Merci par avance, William pas int mais unsigned char Lien vers le commentaire Partager sur d’autres sites More sharing options...
Epractical Posté(e) le 7 juin 2009 Auteur Partager Posté(e) le 7 juin 2009 Bonjour, Je n'ai rien déclaré du tout pour l'UNICODE, ISO truc. De plus j'ai fait par exemple : void main(void) { unsigned char code_ascii; code_ascii = (long) "é"; printf("%d", code_ascii); getch(); } et j'obtiens alors qu'en ASCII étendue c'est 130 (http://www.table-ascii.com/) Comment dois je faire par exemple si j'ai le caractère "é" pour le récupérer dans un long ou int ? Merci Willou Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 Est ce que printf("é") t'affiche bien é ? Chez moi, ca marche, les codes suivant : void main() { unsigned char code; code = 'é'; printf("%u%c", code, code); getch(); } void main() { unsigned char code; code = 130; printf("%u%c", code, code); getch(); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Epractical Posté(e) le 7 juin 2009 Auteur Partager Posté(e) le 7 juin 2009 Pour le premier ça m'affiche "ù" La 2nd solution affiche bien "é" void main() { unsigned char code; code = 130; printf("%u%c", code, code); getch(); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 ton compilo encode tes chaînes en Latin1(ISO-8859-1), il est donc normal que tu ne récupères pas correctement le code ASCII. 1) Si tu lis depuis un fichier un texte, ton 'é' sera correct 2) Si tu as besoin d'une chaîne litérale, utilise une fonction de conversion de Latin1 vers ascii (CharToOem ?) #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h> void main() { wchar_t * cc = L"é"; char * cc2 = new char[3]; CharToOem(cc,cc2); unsigned char code; code = cc2[0]; printf("%u%c", code, code); getch(); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Epractical Posté(e) le 7 juin 2009 Auteur Partager Posté(e) le 7 juin 2009 Oulala ça se complique je suis novis en C En fait je charge un fichier .txt avec la fonction fgetc() et je charge chacuns des caractères dans un tableau dynamique au format char. Ensuite je créer un autre tableau dynamique cette fois ci en long qui contiendra pour chaques lignes le caractère correspondant au code ASCII. Malgré tout j'obtiens quand même un code ASCII négatif dans la donnée en long. En gros ça ressemble à ça : for(i=0; i < (fic.longeur_tableau-1); i++) //On balaye 1 à 1 les caractères du fichiers { var = fgetc(fichier); if(var != EOF) { fic.contenu_depart_char[i] = var; fic.contenu_depart_long[i] = (long) fic.contenu_depart_char[i]; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Shtong Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 Le problème c'est que le type char ne peut contenir QUE des caractères ASCII, et pas au-delà. Si tu veux réellement lire le bon caractère, il faut d'abord connaître de quelle manière il a été écrit, c'est à dire connaître son encodage. Ça ne dépends pas de ton compilateur mais du fichier que tu lis. Pour info tu peux voir l'encodage d'un fichier créé par Notepad quand tu fais "Enregistrer sous" (il y a une liste pour choisir l'encodage). Ceci dit ça ne devrait pas te poser de problèmes puisque le cryptage se fait au niveau des octets et non des caractères. Quel que soit le contenu du fichier tu devrais retrouver le même une fois encrypté - décrypté, et c'est ça qui compte ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 Malgré tout j'obtiens quand même un code ASCII négatif dans la donnée en long.[/code] Parce que ce doit etre un UNSIGNED char ! Le convertir en long ne sert à rien. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Epractical Posté(e) le 7 juin 2009 Auteur Partager Posté(e) le 7 juin 2009 Le problème c'est que si j'obtiens un nombre négatif c'est trop le bazar avec le RSA. void main() { unsigned int code_ascii; unsigned char caract[3] ="é"; code_ascii = (int) caract[0]; printf("%d", code_ascii); getch(); } J'obtiens alors 233 ce qui ne correspond pas au code ASCII étendu du "é" qui est de 130. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 7 juin 2009 Partager Posté(e) le 7 juin 2009 Quand toi tu regarde le "code ASCII" du caractère 'é', tu obtiens le code Latin1 parce que ton compilo encode ta chaine litérale en Latin1. Mais si tu lis un fichier texte codé en ASCII, tu obtiendras bien 130 ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.