cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 2011
-
5 avril 2005 à 17:45
BaFM
Messages postés64Date d'inscriptionmercredi 24 juillet 2002StatutMembreDernière intervention26 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 !
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 ?
cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 20111 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)
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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
cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 20111 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.
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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
cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 20111 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 ?
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 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
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()+")]";
BaFM
Messages postés64Date d'inscriptionmercredi 24 juillet 2002StatutMembreDernière intervention26 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.