"CRYPTAGE" avec le code ascii étendue

Le
darkwall_37
Bonjour,

Pour m'entraîner j'essaye de manipuler les chaines de caractères ainsi
que la lecture/écriture de fichiers. Le code suivant permet
"d'encrypter" selon une transformation très complexe :joke:, les
caractères A-Z et 0-9, tout autre caractère est sinon transformé en
'x'. Le programme lit un fichier contenant la chaine de caractère à
transformer puis ensuite il fait son boulot.

Maintenant j'aimerais pouvoir le faire avec tout les caractères du
code ASCII étendu. J'utilise la fonction CharToOem pour afficher ces
caractères. Jusque là pas de soucis. Quand je viens à les tester c'es=
t
autre chose afin de leur assigner leur valeur décimale. Je sais que
pour le 'é' ont peut l'afficher en utilisant 202, donc en faisant le
test avec cela, la transformation s'opère. Maintenant pour les autres
caractères, comment je fais pour obtenir ces codes s'ils existent ?
Oui je vais me taper 256 lignes -.-. Je ne vois pas comment faire
autrement. Peut être que je me fourvoie et qu'il y a mieux à faire ?

Merci d'avance

#include<stdio.h>
#include<stdlib.h>
#include <windows.h>



int CharFichier( FILE *fichier );
void EnregistrerFichier( FILE *fichier, char *Chaine );
void CharToInt( char *Chaine, int Taille, int *Entier );
void Encryption( int *Entier, int Taille, int *EntierEncryptes );
void FinEncryption( int *Entier, int Taille, char *Chaine );

int main (void)
{

FILE *f0 = fopen("cle.txt","r");
int taille=CharFichier(f0);
fclose(f0);

char *Raw=malloc(taille*sizeof(char));
char *Encrypted=malloc(taille*sizeof(char));
int *RawToInt=malloc(taille*sizeof(int));
int *IntToEncrypt=malloc(taille*sizeof(int));
char *Init=malloc(taille*sizeof(char));


printf("taille=%d",taille);

FILE * f1 = fopen("cle.txt","r");
EnregistrerFichier(f1, Init);
fclose(f1);

CharToOem (Init,Raw);

CharToInt( Raw, taille, RawToInt );
Encryption( RawToInt, taille, IntToEncrypt );
FinEncryption( IntToEncrypt, taille, Encrypted );

int j=0;
for ( j ; j<taille ; j++ )
{
printf("%c",Raw[j]);
}

printf("");
int k=0;
for ( k ; k<taille ; k++ )
{
printf("%d",RawToInt[k]);
printf(" ");
}

printf("");
int l=0;
for ( l ; l<taille ; l++ )
{
printf("%d",IntToEncrypt[l]);
printf(" ");
}

printf("");
int m=0;
for ( m ; m<taille ; m++ )
{
printf("%c", Encrypted[m]);

}

getchar();
}

int CharFichier( FILE *fichier )
{
int taille=0;
char c;
if(fichier != NULL)
{
while(fscanf(fichier,"%c",&c) != EOF)
{
taille++;
}
}

return taille;
}


void EnregistrerFichier( FILE *fichier, char *Chaine )
{
if(fichier != NULL)
{
int i=0;
char c;
while(fscanf(fichier,"%c",&c) != EOF)
{
Chaine[i]=c;
i++;
}
}
}

void CharToInt( char *Chaine, int Taille, int *Entier )
{

int i=0;
for ( i ; i<Taille ; i++ )
{

char c=Chaine[i];
switch ( c )
{

case '202' :
Entier[i]=10;
break;

case 'B' :
Entier[i]=11;
break;

case 'C' :
Entier[i]=12;
break;

case 'D' :
Entier[i]=13;
break;

case 'E' :
Entier[i]=14;
break;

case 'F' :
Entier[i]=15;
break;

case 'G' :
Entier[i]=16;
break;

case 'H' :
Entier[i]=17;
break;

case 'I' :
Entier[i]=18;
break;

case 'J' :
Entier[i]=19;
break;

case 'K' :
Entier[i]=20;
break;

case 'L' :
Entier[i]=21;
break;

case 'M' :
Entier[i]=22;
break;

case 'N' :
Entier[i]=23;
break;

case 'O' :
Entier[i]=24;
break;

case 'P' :
Entier[i]=25;
break;

case 'Q' :
Entier[i]=26;
break;

case 'R' :
Entier[i]=27;
break;

case 'S' :
Entier[i]=28;
break;

case 'T' :
Entier[i]=29;
break;

case 'U' :
Entier[i]=30;
break;

case 'V' :
Entier[i]=31;
break;

case 'W' :
Entier[i]=32;
break;

case 'X' :
Entier[i]=33;
break;

case 'Y' :
Entier[i]=34;
break;

case 'Z' :
Entier[i]=35;
break;

case '0' :
Entier[i]=0;
break;

case '1' :
Entier[i]=1;
break;

case '2' :
Entier[i]=2;
break;

case '3' :
Entier[i]=3;
break;

case '4' :
Entier[i]=4;
break;

case '5' :
Entier[i]=5;
break;

case '6' :
Entier[i]=6;
break;

case '7' :
Entier[i]=7;
break;

case '8' :
Entier[i]=8;
break;

case '9' :
Entier[i]=9;
break;

default :
Entier[i]=999;
break;

}
}

}

void Encryption( int *Entier, int Taille, int *EntierEncryptes )
{
int i=0;
for ( i ; i<Taille ; i++ )
{
EntierEncryptes[i] = 35-Entier[i];
}
}

void FinEncryption( int *Entier, int Taille, char *Chaine )
{

int i=0;
for ( i ; i<Taille ; i++ )
{

int e=Entier[i];
switch ( e )
{

case 0 :
Chaine[i]='0';
break;

case 1 :
Chaine[i]='1';
break;

case 2 :
Chaine[i]='2';
break;

case 3 :
Chaine[i]='3';
break;

case 4 :
Chaine[i]='4';
break;

case 5 :
Chaine[i]='5';
break;

case 6 :
Chaine[i]='6';
break;

case 7 :
Chaine[i]='7';
break;

case 8 :
Chaine[i]='8';
break;

case 9 :
Chaine[i]='9';
break;

case 10 :
Chaine[i]='é';
break;

case 11 :
Chaine[i]='B';
break;

case 12 :
Chaine[i]='C';
break;

case 13 :
Chaine[i]='D';
break;

case 14 :
Chaine[i]='E';
break;

case 15 :
Chaine[i]='F';
break;

case 16 :
Chaine[i]='G';
break;

case 17 :
Chaine[i]='H';
break;

case 18 :
Chaine[i]='I';
break;

case 19 :
Chaine[i]='J';
break;

case 20 :
Chaine[i]='K';
break;

case 21 :
Chaine[i]='L';
break;

case 22 :
Chaine[i]='M';
break;

case 23 :
Chaine[i]='N';
break;

case 24 :
Chaine[i]='O';
break;

case 25 :
Chaine[i]='P';
break;

case 26 :
Chaine[i]='Q';
break;

case 27 :
Chaine[i]='R';
break;

case 28 :
Chaine[i]='S';
break;

case 29 :
Chaine[i]='T';
break;

case 30 :
Chaine[i]='U';
break;

case 31 :
Chaine[i]='V';
break;

case 32 :
Chaine[i]='W';
break;

case 33 :
Chaine[i]='X';
break;

case 34 :
Chaine[i]='Y';
break;

case 35 :
Chaine[i]='Z';
break;

default :
Chaine[i]='x';
break;

}
}

}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Lucas Levrel
Le #20384201
Le 19 octobre 2009, darkwall_37 a écrit :

Maintenant j'aimerais pouvoir le faire avec tout les caractères du
code ASCII étendu.



Il n'y a pas un unique « ASCII étendu ». La correspondance
caractère-nombre dépend de ce qu'on appelle l'encodage. En général, les
encodages reprennent tous l'ASCII pour les nombres 0 à 127 (7 bits).
Regarde sur Wikipedia les noms latin-1, ..., latin-9, mac-roman, cp1252,
utf-8...

L'encodage utilisé est défini par le système d'exploitation. Pour Windows
je ne sais pas où. Pour Linux c'est la variable $LANG qui le fait
indirectement.

--
LL
darkwall_37
Le #20386131
On 20 oct, 10:26, Lucas Levrel
Le 19 octobre 2009, darkwall_37 a écrit :

> Maintenant j'aimerais pouvoir le faire avec tout les caractères du
> code ASCII étendu.

Il n'y a pas un unique « ASCII étendu ». La correspondance
caractère-nombre dépend de ce qu'on appelle l'encodage. En généra l, les
encodages reprennent tous l'ASCII pour les nombres 0 à 127 (7 bits).
Regarde sur Wikipedia les noms latin-1, ..., latin-9, mac-roman, cp1252,
utf-8...

L'encodage utilisé est défini par le système d'exploitation. Pour W indows
je ne sais pas où. Pour Linux c'est la variable $LANG qui le fait
indirectement.

--
LL



OK mais si je fais strcmp( temp, "é")==0, (temp=chaine[i]) le test
renvois toujours 1 bien que le dans la chaine contienne 'é'. Y'a t-il
une solution ?
Hamiral
Le #20386121
darkwall_37 a écrit :
OK mais si je fais strcmp( temp, "é")==0, (temp=chaine[i]) le t est
renvois toujours 1 bien que le dans la chaine contienne 'é'. Y'a t-il
une solution ?



Serait-ce que l'encodage dans lequel votre fichier source est enregistré
est différent de l'encodage dans lequel le caractère est mis dans "te mp"
à l'exécution ?
C'est à s'en arracher les cheveux...

Ham
darkwall_37
Le #20386481
On 20 oct, 15:05, Hamiral
darkwall_37 a écrit :

> OK mais si je fais strcmp( temp, "é")==0, (temp=chaine[i]) le t est
> renvois toujours 1 bien que le dans la chaine contienne 'é'. Y'a t-il
> une solution ?

Serait-ce que l'encodage dans lequel votre fichier source est enregistr é
est différent de l'encodage dans lequel le caractère est mis dans "te mp"
à l'exécution ?
C'est à s'en arracher les cheveux...

Ham



Si en fait cela marche.
Je voudrais pouvoir générer la table ascii étendu sous forme octal
pour éviter de me taper les 256 caractères. J'ai de multiples erreurs
à la compilation sur le tableau ( il est faux mais en supposant qu'il
le soit ), pouquoi ai-je des erreurs en sachant que par exemple 202
correspond bien au caractère "é" ?

void CharToInt( char *Chaine, int Taille, int *Entier )
{

char ASCIIE[377]=
{'','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','2 6','27','28','29','30','31','32','33','34','35','36','37','38', '39','40','41','42','43','44','45','46','47','48','49','50','5 1','52','53','54','55','56','57','58','59','60','61','62','63', '64','65','66','67','68','69','70','71','72','73','74','75','7 6','77','78','79','80','81','82','83','84','85','86','87','88', '89','90','91','92','93','94','95','96','97','98','99','100',' 101','102','103','104','105','106','107','108','109','110','111', '112','113','114','115','116','117','118','119','120','121','122 ','123','124','125','126','127','128','129','130','131','132','1 33','134','135','136','137','138','139','140','141','142','143',' 144','145','146','147','148','149','150','151','152','153','154' ,'155','156','157','158','159','160','161','162','163','164','16 5','166','167','168','169','170','171','172','173','174','175',' 176','177','178','179','180','181','182','183','184','185','186', '187','188','189','190','191','192','193','194','195','196','197 ','198','199','200','201','202','203','204','205','206','207','2 08','209','210','211','212','213','214','215','216','217','218',' 219','220','221','222','223','224','225','226','227','228','229' ,'230','231','232','233','234','235','236','237','238','239','24 0','241','242','243','244','245','246','247','248','249','250',' 251','252','253','254','255','256','257','258','259','260','261', '262','263','264','265','266','267','268','269','270','271','272 ','273','274','275','276','277','278','279','280','281','282','2 83','284','285','286','287','288','289','290','291','292','293',' 294','295','296','297','298','299','300','301','302','303','304' ,'305','306','307','308','309','310','311','312','313','314','31 5','316','317','318','319','320','321','322','323','324','325',' 326','327','328','329','330','331','332','333','334','335','336', '337','338','339','340','341','342','343','344','345','346','347 ','348','349','350','351','352','353','354','355','356','357','3 58','359','360','361','362','363','364','365','366','367','368',' 369','370','371','372','373','374','375','376','377'};
char temp[1];
char temp1[1];
int i, j=0;
for ( i ; i<Taille ; i++ )
{
sprintf(temp,"%c",Chaine[i]);
for ( j ; j<77 ; j++ )
{
sprintf(temp1,"%c",ASCIIE[j]);
if ( strcmp( temp, temp1 )==0 )
{
Entier[i]=j;
}
}
}

}
Mickaël Wolff
Le #20387601
darkwall_37 wrote:
Pour m'entraîner j'essaye de manipuler les chaines de caractères ainsi
que la lecture/écriture de fichiers. Le code suivant permet
"d'encrypter" selon une transformation très complexe :joke:, les
caractères A-Z et 0-9, tout autre caractère est sinon transformé en
'x'. Le programme lit un fichier contenant la chaine de caractère à
transformer puis ensuite il fait son boulot.



Il y a de nombreuses remarques à faire sur ton code. Le premier est
que ton exemple ne compile pas. Au-delà de cet étrange en-tete windows.h
(:D), il manque la fonction CharToOem. mais le pire à mon avis, est le
manque de commentaire, et l'absence d'intelligibilité du nom des
fonctions : on se demande ce qu'elles font. D'autres voueraient aux
Gémonies l'absence de tout code de controle des erreurs sur les
fonctions d'aquisition de ressources (malloc, fopen).

Mais j'insiste sur l'expression de ton code et de commentaires : on
ne comprend pas ce que tu veux faire, et c'est donc difficile de
comprendre les erreurs que tu fais.

Maintenant j'aimerais pouvoir le faire avec tout les caractères du
code ASCII étendu. J'utilise la fonction CharToOem pour afficher ces
caractères. Jusque là pas de soucis. Quand je viens à les tester c'est
autre chose afin de leur assigner leur valeur décimale. Je sais que
pour le 'é' ont peut l'afficher en utilisant 202, donc en faisant le
test avec cela, la transformation s'opère. Maintenant pour les autres
caractères, comment je fais pour obtenir ces codes s'ils existent ?



'a' est un entier. Les littéraux de caractères sont fondamentalement
des entiers cours. Donc tu peux écrire :
int charasint = (int) 'a' ;

En ce qui concerne les caractères d'ASCII étendu, ça dépend entre
autre du jeu de caractères que tu utilises pour écrire ton code, et du
jeu de caractère du fichier traduit.

Oui je vais me taper 256 lignes -.-. Je ne vois pas comment faire
autrement. Peut être que je me fourvoie et qu'il y a mieux à faire ?



Oui mais non, c'est pas très adroit. Tu peux caster (en comprenant le
mécanisme sous-jacent), et utiliser les fonctions dédiées (atoint,
isalpha, etc).

Mais au fait, pourquoi tu traduit les char en int ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
darkwall_37
Le #20387971
On 20 oct, 18:20, Mickaël Wolff
darkwall_37 wrote:
> Pour m'entra ner j'essaye de manipuler les chaines de caract res ainsi
> que la lecture/ criture de fichiers. Le code suivant permet
> "d'encrypter" selon une transformation tr s complexe :joke:, les
> caract res A-Z et 0-9, tout autre caract re est sinon transform en
> 'x'. Le programme lit un fichier contenant la chaine de caract re
> transformer puis ensuite il fait son boulot.

   Il y a de nombreuses remarques faire sur ton code. Le premier est
que ton exemple ne compile pas. Au-del de cet trange en-tete windows.h
(:D), il manque la fonction CharToOem. mais le pire mon avis, est le
manque de commentaire, et l'absence d'intelligibilit du nom des
fonctions : on se demande ce qu'elles font. D'autres voueraient aux
G monies l'absence de tout code de controle des erreurs sur les
fonctions d'aquisition de ressources (malloc, fopen).

   Mais j'insiste sur l'expression de ton code et de commentaires : o n
ne comprend pas ce que tu veux faire, et c'est donc difficile de
comprendre les erreurs que tu fais.

> Maintenant j'aimerais pouvoir le faire avec tout les caract res du
> code ASCII tendu. J'utilise la fonction CharToOem pour afficher ces
> caract res. Jusque l pas de soucis. Quand je viens les tester c'est
> autre chose afin de leur assigner leur valeur d cimale. Je sais que
> pour le ' ' ont peut l'afficher en utilisant 202, donc en faisant le
> test avec cela, la transformation s'op re. Maintenant pour les autres
> caract res, comment je fais pour obtenir ces codes s'ils existent ?

   'a' est un entier. Les litt raux de caract res sont fondamentaleme nt
des entiers cours. Donc tu peux crire :
   int charasint = (int) 'a' ;

   En ce qui concerne les caract res d'ASCII tendu, a d pend entre
autre du jeu de caract res que tu utilises pour crire ton code, et du
jeu de caract re du fichier traduit.

> Oui je vais me taper 256 lignes -.-. Je ne vois pas comment faire
> autrement. Peut tre que je me fourvoie et qu'il y a mieux faire ?

   Oui mais non, c'est pas tr s adroit. Tu peux caster (en comprenant le
m canisme sous-jacent), et utiliser les fonctions d di es (atoint,
isalpha, etc).

   Mais au fait, pourquoi tu traduit les char en int ?

--
Micka l Wolff aka Lupus Michaelishttp://lupusmic.org




J'ai un fichier texte (ouverture avec notepad).
Je rentre une quelconque chaine de caractères ( encodage ASCII Etendu
des caractères ).
Je la récupère dans un tableau de type char.
Une première fonction me retourne un tableau d'entiers contenant la
valeur décimale correspondante du code ASCII étendu
Une seconde fonction de "cryptage" modifie mon tableau d'entiers.
Une troisième fonction me retourne un tableau de type char contenant
la nouvelle chaine de caractères du aux nouvelles valeurs décimales
modifiées par la fonction précédentes.
L'entrée et le résultat sont affichés dans l'invite de commande.

Mon problème étant que je souhaiterais savoir comment faire pour
sauver dans un tableau de type char tous les caractères de la table
ASCII étendue pour ne pas avoir à le faire manuellement ?
Je me souvenais que 202 correspondait au caractère é. Je me suis donc
dis qu'avec une boucle, une fonction de convertion de base 10 à base 8
je pourrais remplir un tableau de type char de la forme ASCII[256]=
{'',...,'377'};
Mais cela ne fonctionne apparemment pas.




#include #include #include


int TailleFichier ( FILE
*fichier );
void MemoriserFichier ( FILE *fichier, char
*Chaine );
void CharToInt ( char *Chaine, int Taille, int
*Entier );
void Encryption ( int *Entier, int Taille, int
*EntierEncryptes );
void MethodeEncryption ( int *Entier, int Taille, char
*Chaine );
void AfficherTableauChar ( char *Tableau, int
Taille );
void AfficherTableauInt ( int *Tableau, int
Taille );

int main (void)
{

// On compte le nombre de charactères dans le fichier
FILE *f0 = fopen("cle.txt","r");
int taille=TailleFichier(f0);
fclose(f0);

// On alloue en mémoire les tableaux nécessaires
char *Raw = malloc(taille*sizeof(char));
char *Temp = malloc(taille*sizeof(char));
char *Encrypted = malloc(taille*sizeof(char));
int *RawToAscii = malloc(taille*sizeof(int ));
int *AsciiToEncrytp = malloc(taille*sizeof(int ));

printf("taille=%dn",taille);

// On enregistre la chaine de caractères contenue dans le fichier
FILE * f1 = fopen("cle.txt","r");
MemoriserFichier(f1, Temp);
fclose(f1);


CharToOem ( Temp,Raw );
// On donne la valeur décimale correspondante au caractère
CharToInt ( Raw, taille, RawToAscii );
// On effectue l'opération de cryptage
Encryption ( RawToAscii, taille, AsciiToEncrytp );
// On cherche le nouveau caractère correspondant à la valeur
décimale
MethodeEncryption( AsciiToEncrytp, taille, Encrypted );

AfficherTableauChar(Raw, taille );
printf("n");
//AfficherTableauInt (RawToAscii, taille );
printf("n");
//AfficherTableauInt (AsciiToEncrytp, taille);
printf("n");
AfficherTableauChar(Encrypted, taille );

getchar();
}

void AfficherTableauChar( char *Tableau, int Taille )
{
int i=0;
for ( i ; i<Taille ; i++ )
{
printf("%c",Tableau[i]);
}
}

void AfficherTableauInt( int *Tableau, int Taille )
{
int i=0;
for ( i ; i<Taille ; i++ )
{
printf("%d",Tableau[i]);
}
}


int TailleFichier( FILE *fichier )
{
int taille=0;
char c;
if(fichier != NULL)
{
while(fscanf(fichier,"%c",&c) != EOF)
{
taille++;
}
}

return taille;
}


void MemoriserFichier( FILE *fichier, char *Chaine )
{
if(fichier != NULL)
{
int i=0;
char c;
while(fscanf(fichier,"%c",&c) != EOF)
{
Chaine[i]=c;
i++;
}
}
}

void CharToInt( char *Chaine, int Taille, int *Entier )
{

int i=0;
for ( i ; i<Taille ; i++ )
{

char c=Chaine[i];
switch ( c )
{


case '0' :
Entier[i]=0;
break;

case '1' :
Entier[i]=1;
break;

case '2' :
Entier[i]=2;
break;

case '3' :
Entier[i]=3;
break;

case '4' :
Entier[i]=4;
break;

case '5' :
Entier[i]=5;
break;

case '6' :
Entier[i]=6;
break;

case '7' :
Entier[i]=7;
break;

case '8' :
Entier[i]=8;
break;

case '9' :
Entier[i]=9;
break;

case 'é' :
Entier[i];
break;

case 'B' :
Entier[i];
break;

case 'C' :
Entier[i];
break;

case 'D' :
Entier[i];
break;

case 'E' :
Entier[i];
break;

case 'F' :
Entier[i];
break;

case 'G' :
Entier[i];
break;

case 'H' :
Entier[i];
break;

case 'I' :
Entier[i];
break;

case 'J' :
Entier[i];
break;

case 'K' :
Entier[i] ;
break;

case 'L' :
Entier[i]!;
break;

case 'M' :
Entier[i]";
break;

case 'N' :
Entier[i]#;
break;

case 'O' :
Entier[i]$;
break;

case 'P' :
Entier[i]%;
break;

case 'Q' :
Entier[i]&;
break;

case 'R' :
Entier[i]';
break;

case 'S' :
Entier[i](;
break;

case 'T' :
Entier[i]);
break;

case 'U' :
Entier[i]0;
break;

case 'V' :
Entier[i]1;
break;

case 'W' :
Entier[i]2;
break;

case 'X' :
Entier[i]3;
break;

case 'Y' :
Entier[i]4;
break;

case 'Z' :
Entier[i]5;
break;

default :
Entier[i]™9;
break;

}
}

}

void Encryption( int *Entier, int Taille, int *EntierEncryptes )
{
int i=0;
for ( i ; i<Taille ; i++ )
{
EntierEncryptes[i] = 35-Entier[i];
}
}

void MethodeEncryption( int *Entier, int Taille, char *Chaine )
{

int i=0;
for ( i ; i<Taille ; i++ )
{

int e=Entier[i];
switch ( e )
{

case 0 :
Chaine[i]='0';
break;

case 1 :
Chaine[i]='1';
break;

case 2 :
Chaine[i]='2';
break;

case 3 :
Chaine[i]='3';
break;

case 4 :
Chaine[i]='4';
break;

case 5 :
Chaine[i]='5';
break;

case 6 :
Chaine[i]='6';
break;

case 7 :
Chaine[i]='7';
break;

case 8 :
Chaine[i]='8';
break;

case 9 :
Chaine[i]='9';
break;

case 10 :
Chaine[i]='é';
break;

case 11 :
Chaine[i]='B';
break;

case 12 :
Chaine[i]='C';
break;

case 13 :
Chaine[i]='D';
break;

case 14 :
Chaine[i]='E';
break;

case 15 :
Chaine[i]='F';
break;

case 16 :
Chaine[i]='G';
break;

case 17 :
Chaine[i]='H';
break;

case 18 :
Chaine[i]='I';
break;

case 19 :
Chaine[i]='J';
break;

case 20 :
Chaine[i]='K';
break;

case 21 :
Chaine[i]='L';
break;

case 22 :
Chaine[i]='M';
break;

case 23 :
Chaine[i]='N';
break;

case 24 :
Chaine[i]='O';
break;

case 25 :
Chaine[i]='P';
break;

case 26 :
Chaine[i]='Q';
break;

case 27 :
Chaine[i]='R';
break;

case 28 :
Chaine[i]='S';
break;

case 29 :
Chaine[i]='T';
break;

case 30 :
Chaine[i]='U';
break;

case 31 :
Chaine[i]='V';
break;

case 32 :
Chaine[i]='W';
break;

case 33 :
Chaine[i]='X';
break;

case 34 :
Chaine[i]='Y';
break;

case 35 :
Chaine[i]='Z';
break;

default :
Chaine[i]='x';
break;

}
}

}
Benoit Izac
Le #20388151
Bonjour,

le 20/10/2009 à 10:26, Lucas Levrel a écrit dans le message

L'encodage utilisé est défini par le système d'exploitation. Pour
Windows je ne sais pas où. Pour Linux c'est la variable $LANG qui le
fait indirectement.



Pour UNIX, plus généralement, c'est LC_CTYPE précisément (LANG modifie
LC_CTYPE seulement s'il n'est pas défini ou s'il est vide).


--
Benoit Izac
darkwall_37
Le #20388141
On 20 oct, 19:05, Benoit Izac
Bonjour,

le 20/10/2009 à 10:26, Lucas Levrel a écrit dans le message

> L'encodage utilisé est défini par le système d'exploitation. Pour
> Windows je ne sais pas où. Pour Linux c'est la variable $LANG qui le
> fait indirectement.

Pour UNIX, plus généralement, c'est LC_CTYPE précisément (LANG mo difie
LC_CTYPE seulement s'il n'est pas défini ou s'il est vide).


--
Benoit Izac



Je suis sous windows ^^
Manuel Pégourié-Gonnard
Le #20389851
darkwall_37 scripsit :

J'ai un fichier texte (ouverture avec notepad).
Je rentre une quelconque chaine de caractères ( encodage ASCII Etendu
des caractères ).



Je suis désolé d'insister, mais tu devrais relire attentivement la
réponse de Lucas : ASCII étendu ça ne veut *rien* dire ! Plus
précisément, ça dit quels seront les caractères aux 128 premières
positions, mais ça ne dit rien sur l'interprétation des valeurs de 128 à
255.

C'est vrai que les questions d'encodage sont techniques et pénibles au
début, mais il faut vraiment voir ça sérieusement un jour. Si je ne me
trompe pas, la norme C met en jeu deux encodages de caractères : celui
de l'environnement de compilation, et celui de l'environnement
d'exécution. Ces deux encodages peuvent être différents, il faut en
tenir compte. Plus généralement, quand tu lis un fichier quelconque,
sauf si tu as des informations spécifiques (en-têtes HTTP ou autre forme
de méta-données) il peut être dans un encodage encore différent et il
faut en tenir compte.


--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Mickaël Wolff
Le #20400411
darkwall_37 wrote:

J'ai un fichier texte (ouverture avec notepad).
Je rentre une quelconque chaine de caractères ( encodage ASCII Etendu
des caractères ).


Il faut regarder dans la documentation de Notepad à quoi correspond
concrètement ce concept. Si c'est de l'ASCII étendu ou une variante, ça
sera simple. Si c'est de l'UTF-8, va falloir faire appel à une
bibliothèque spécialisée.


Je la récupère dans un tableau de type char.


Jusque là, ça peut aller.

Une première fonction


Laquelle ? TailleFichier ?

me retourne un tableau d'entiers contenant la
valeur décimale correspondante du code ASCII étendu


Je pense que tu n'as pas compris mon explication : ce que tu lis dans
le fichier, ce *sont* les codes décimaux de tes caractères. Car les
caractères sont des entiers. Cependant, parler de code décimal, octal ou
dodecal n'a pas de sens, puisque ce sont les représentations litérales,
compréhensibles, d'un même nombre.

char a = 'a' ;
char b = 'b' ;
printf("%d + %d = %dn", a, b, a + b) ;
printf("%c + %c = %cn", a, b, a + b) ;

Une seconde fonction de "cryptage" modifie mon tableau d'entiers.


Non. Si tu penses à CharToInt, cette fonction ne modifie pas ton
tableau initial, mais en remplit un autre. Ce n'est pas la même chose.
De toute façon, je ne saisis toujours pas l'intérêt de cette manœuvre.

Une troisième fonction me retourne un tableau de type char


Il est impossible de retourner un tableau depuis une fonction, pas
plus qu'il n'est possible d'en passer un en argument d'une fonction.

la nouvelle chaine de caractères du aux nouvelles valeurs décimales
modifiées par la fonction précédentes.


On ne peut pas te suivre. Arrete de parler des fonctions comme si
elles étaient anonymes. C'est le meilleur moyen pour perdre son monde et
se tromper.

L'entrée et le résultat sont affichés dans l'invite de commande.


Non, sur la sortie standard. Ton programme n'a pas (vraiment)
connaissance du fait que son père est un terminal au rabais.

Mon problème étant que je souhaiterais savoir comment faire pour
sauver dans un tableau de type char tous les caractères de la table
ASCII étendue pour ne pas avoir à le faire manuellement ?


Ben en lisant le fichier, c'est ce que tu fais. Si c'est un ASCII étendu.

Je me souvenais que 202 correspondait au caractère é. Je me suis donc
dis qu'avec une boucle, une fonction de convertion de base 10 à base 8
je pourrais remplir un tableau de type char de la forme ASCII[256] > {'',...,'377'};
Mais cela ne fonctionne apparemment pas.



C'est surtout qu'on se demande pourquoi tu cherche à faire si compliqué.


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Publicité
Poster une réponse
Anonyme