[C#] Table ASCII non standard ???

Signaler
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
-
Messages postés
64
Date d'inscription
mercredi 24 juillet 2002
Statut
Membre
Dernière intervention
26 novembre 2009
-
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

Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
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
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
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
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
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
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
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
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
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
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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
Messages postés
478
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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
Messages postés
346
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
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
Messages postés
64
Date d'inscription
mercredi 24 juillet 2002
Statut
Membre
Dernière intervention
26 novembre 2009

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.