[C#] Table ASCII non standard ???

cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 5 avril 2005 à 17:45
BaFM Messages postés 64 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 26 novembre 2009 - 25 juil. 2007 à 13:29
Bonjour @ tous,


Je dois récuperer des informations d'un périférique et les transformer en codes ASCII, rien de bien sorcier... POURTANT !


Le "s" de ASCII veut bien dire standard, nan ?
Je vais donc chercher une table:
http://big.chez.com/cosmos2000/Nombres/ASCII.html


Je transforme mes caractères comme ceci:
(int)MonTexte[0])
Et il me retourne: 8364 alors que dans la table ASCII élargie, c'est le code 128
(et c'est bien celui la que j'entends retrouver)
J'ai aussi essayé
(byte)MonTexte[0])
Le résultat est plus proche (172) mais ce n'est pas encore ça.


J'ai regardé la table ASCII de msdn pour C# et il n'indique pas €, mais, à sa place un ç majuscule
(et c'est pareil pour les autres caractères de la table étendue)



Qu'est ce qu'il se passe ?
Comment récuperer le bon code ?


Merci d'avance.

David, à VERSAILLES

13 réponses

cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
6 avril 2005 à 11:47
En clair, je donne le caractère € (ou tout autre caractère de la table ASCII étendue) et il faut que ça me retourne 128 (ou l'équivalent pour les autres)

David, à VERSAILLES
0
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
9 avril 2005 à 10:30
Salut,

Le dotnet ne code pas ses chaîne en ASCII mais en unicode, si tu veux retrouver ta valeur ascii il faut faire :
System.Text.ASCIIEncoding.ASCII.GetBytes(MonTexte)[0]

Qui est un peu barbare il faut l'avouer.
Mais à mon sens il est plus sage de faire le test :
MonTexte[0]=='€'

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
0
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
9 avril 2005 à 10:34
Elle ne serait pas un peu foireuse la table que tu a trouvée


128,
€,
10101100
chez moi 128 en binaire ça fait plutôt 10000000

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
11 avril 2005 à 08:52
C'est ce que je commence à me dire car tu as raison, 128 c'est bien 10000000.
Mais moi, si je fait (int)"€", il me renvoye 128 mais pas l'inverse ???

N'est ce pas à ce moment qu'il y a un pb ?

David, à VERSAILLES
0

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

Posez votre question
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
11 avril 2005 à 09:18
Attention il faut faire la distinction entre (int)"€" et (int)'€'
le premier essaye de convertir la chaîne de caractère (et ne devrait même pas se compiler)
le deuxième converti le caractère

10101100 en binaire me donne 172 en décimal

mais conseil c'est : ne converti pas les valeurs !!!!! tu risques de te retrouver devant des résultats inattendus :
il vaut mieux faire
MaChaine[x] == '€'
que
(int)MaChaine[x] == (int)'€'

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
11 avril 2005 à 11:50
En fait, je n'utilise pas les guillemets, c'était pour l'exemple (mais c tout de même bon à savoir).


Voici mon code:



int ligneMod = (
int)ligne[ligne.Length-3];



je récupère une ligne qui a été codée en basic.
En fait, c'est pour passer des valeurs de 0 à 255 entre 2 programmes, on utilise donc des bits au lieu de chaines, c plus sur.
Du coté basic, il fait (comparaison en C): (char)128 et moi, quand je lis la string (car il y a plusieurs caractères), ce bit est représenté sous le char €, et il me renvoye le code ASCII 8000 et des brouettes.

David, à VERSAILLES
0
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
11 avril 2005 à 11:55
Ok,
Alors si ligne est un tableau de byte, il faut d'abord le convertir un chaîne ou directement le traiter en byte.
Pour les conversions, il faut utiliser :
System.text.ASCIIEncoding.ASCII.GetString(byte[], offset, length)
System.text.ASCIIEncoding.ASCII.GetBytes(string)

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
11 avril 2005 à 12:14
Heu...

en fait, tu me conseilles de faire:

ligne = System.Text.ASCIIEncoding.ASCII.GetString(ligne);


ligne = System.Text.ASCIIEncoding.ASCII.GetBytes(ligne);



C ça ?

pour la première, il me dit: impossible de convertir de 'string' en 'byte[]'
et pour le 2, c le contraire: Impossible de convertir implicitement le type 'byte[]' en 'string'

C quoi alors ma string si ce n'est ni une string ni un tableau de bytes ?

désolé de te torturer.

Je ne sais pas ce qu'est l'offset

David, à VERSAILLES
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
11 avril 2005 à 12:16
Pour l'offset, c'est le début du tableau, j'ai donc mis 0 et pour length, j'ai mis ligne.length-1 mais ça pète dans les paramètres

David, à VERSAILLES
0
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
11 avril 2005 à 12:20
offset -> décalage, c'est la position du caractère à partir duquel tu produit la conversion.
comme tu produits une conversion, la sortie de ta conversion n'a pas la même nature que l'entrée, il faut donc créer une nouvelle variable.

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
0
cs_Warny Messages postés 473 Date d'inscription mercredi 7 août 2002 Statut Membre Dernière intervention 10 juin 2015
11 avril 2005 à 12:24
PS : L'aide en ligne est VITALE. Quand j'indique une commande, je tiens compte du fait que tu as la possibilité de la consulter.

Console.Out.WriteLine("Warny")

Il y a 10 types de personnes
Ceux qui comptent en binaire... et les autres
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
11 avril 2005 à 12:28
Mais en fait, ça revient au même que ce que tu m'a dit plus haut:

System.Text.ASCIIEncoding.ASCII.GetBytes(ligne)[ligne.Length-3];

sauf qu'on code juste le caractère désiré au lieu de toute la ligne.
Mais ça, ça me renvoyait aussi 8000 et quelques.

nan, je croit que c'est un pb entre basic et C, je vais laisser de coté et reprendre plus tard, j'ai passé trop de temps dessus.
Enfin, si tu as la courage, je te laisse le code:


//System.Text.ASCIIEncoding.ASCII.GetBytes(ligne.ToCharArray(),0,ligne.Length-1);
//System.Text.ASCIIEncoding.ASCII.GetString(ligne);
int checkSum = 0;

for (
int i=0;i<ligne.Length-3;i++)
// Recherche du nombre total
checkSum += (
int)ligne[i];

int ligneMod = (
int)ligne[ligne.Length-3];
// System.Text.ASCIIEncoding.ASCII.GetBytes(ligne)[ligne.Length-3];
int ligneRes = (
int)ligne[ligne.Length-2];
//System.Text.ASCIIEncoding.ASCII.GetBytes(ligne)[ligne.Length-2];
int checkMod = (
int)checkSum%256;

int checkRes = (
int)checkSum/256;

if (((ligneMod==checkMod)) && (ligneRes==checkRes))
{
// ON FAIT NOS TRUCS
}
else{

msgErr += " ERREUR DU CHECKSUM: [ "+checkSum.ToString()+" ("+checkMod.ToString()+")("+checkRes.ToString()+")]";

}

David, à VERSAILLES
0
BaFM Messages postés 64 Date d'inscription mercredi 24 juillet 2002 Statut Membre Dernière intervention 26 novembre 2009
25 juil. 2007 à 13:29
Bon, alors, si tu n'a pas encore trouvé ta réponse ou que tu as toujours ton code moche, je vais te donner un truc :

Je pense que tu utilise les stream pour lire les donnees que tu importe ou exporte, n'est-ce pas. Et bien dans le constructeur de StreamReader/StreamWriter et associées tu peux préciser l'encodage. Et donc tu leur passe les System.Text.ASCIIEncoding.ASCII et ce serat tout bon ! Plus besoin de convertion ni de quoique ce soit dans ton code, c'est directement et correctement fait par le framework. Sinon si tu veux réellement lire en binaire, tu peux utilise les Stream directement sans utiliser reader et writer et tu auras les octets de ton fichier.

Et vive le réveil de vieux messages.
0
Rejoignez-nous