Conversion ASCII vers binaire.

Bonjour à tous,
L'essentiel de ma requête est dans le titre. Je cherche, en vain, une fonction ou une librairie qui permettrait de convertir de l'ASCII en binaire et inversement.
Avez-vous quelquechose à me proposer ?

Merci, Math.

Salut,

Oué mais c'est un peu vague comme question ... Tu veux réceptionner des données série en binaire au lieu d'ASCII ?

ta question n'est pas bête (mais vague comme le b@tto), mais ... l'ascii, c'est du binaire... en gros, tu cherches à convertir "A" en b01000001 ou encore "2" en b00110010 ?

Si c'est ça, ce que tu cherches, c'est à transformer de l'ascii en ascii... un caractère est codé en ascii, soit un nombre sur 8 bits. une petite recherche gogol sur "table ascii" te donnera les codes de tous les caractères.

Sinon, il faut donner plus de précisions...

Merci pour vos réponses rapides.

C'est bien ce que je veux faire oui, je sais qu'il existe des fonctions dédiées dans certains langages.
En fait, je voudrais simplement obtenir automatiquement la correspondance en binaire que l'on trouve dans des tables ascii (http://www.table-ascii.com/ par exemple).
J'ai commencé à l'écrire "à la main" mais c'est horriblement long...

Oui mais pourquoi faire ?? Si tu nous disais l'application précise je t'aurais répondu depuis mon premier message ...

A mon avis, tu ne comprends pas le type "caractère". exemple (pas facile à expliquer tellement c'est simple) :

 char a = 'A';  // la variable a contient le caractère 'A'
 byte b = a;  // l'octet b contient la valeur numérique de a

Serial. println (b, DEC);  // envoie "65" sur le terminal série,  c'est le code ascii de 'A'
Serial. println (a, DEC);  // fait exactement la même chose

que cesoit char ou byte, c'est exactement la même chose, la variable contient le code ascii du caractère. de même, byte b = "2"; est la même chose que byte b = 50;

un caractère n'est en fait qu'une valeur numérique, c'est de traiter cette valeur en char qui fait qu'on y trouve la correspondance avec un caractère. il n'y a rien à faire d'autre... ton arduino ne connait que des 1 et des 0, donc il ne peut pas avoir un caractère dans ses données, uniquement son code avec des 1 et des 0...

Ce n'est en effet pas très clair..

@B@tto : Je veux convertir du texte issu de fichiers en 0 et en 1 pour après le transmettre par impulsions lumineuses.
En fait, je voudrais partir avec une String "abc" et obtenir une String "011000010110001001100011".

@super_cinci : Merci mais je ne vois pas comment obtenir ce que je veux avec ça... C'est certainement très simple mais est-ce que c'est possible avec des String ?

math33:
@super_cinci : Merci mais je ne vois pas comment obtenir ce que je veux avec ça... C'est certainement très simple mais est-ce que c'est possible avec des String ?

string s1 = "ABC"; // est équivalent à :
byte s2[4] = {65, 66, 67, 0};

donc s1[2] contient 'C' ou encore 67, tout comme s2[2]. donc tu peux traiter s1 comme un tableau de byte...

tu as tenté d'utiliser Serial.write(s1) qui va (en plus des bits de start et stop) envoyer les 1 et 0 sur la pin 1, à toi d'y connecter une LED. à voir si tu peux faire un Serial.begin() avec un baudrate très bas...

Il faut bien faire attention à la différence entre String et string. Le premier est un type de variable introduit depuis la version 1 de l'IDE et qu'il faut éviter d'utiliser (y'a plein de magouille derrière et un jour tu auras des problèmes tu comprendras pas d'où ça vient ... et on peut très bien s'en passé). Et string qui est un tableau de char. La seule différence avec un tableau de byte c'est qu'il y a un caractère NULL à la fin.

Donc comme te l'a montré Super_Cinci, c'est très facile à manipuler :wink:

soit une variable byte ou char toto
soit un opérateur >> (décalage à droite)
et un opérateur & (et logique)

byte sortie;
for (int i=0; i<8; i++){
     sortie = (toto>>i) & 1;
}

ou plus rapide

byte sortie;
sortie = toto;
for (int i=0; i<8; i++){
     sortie = (sortie>>1) & 1;
}

si tu veux émettre en envoyant le MSB en tête tu remplaces >> par <<

Merci pour vos réponses, je réessaie ça ce week end.
Fdufnews, je peux pas tester ton code là mais ça a l'air de faire exactement ce que je veux. Tu aurais une idée du même genre pour réobtenir le texte à partir des 0 et des 1 ?

Je pars du principe que la donnée est envoyé LSB en premier (c'est le bout de code précédent)

byte recu; //le bit que tu viens de recevoir  donc recu = 0 ou 1 normalement
byte valeur; // le résultat après reconstruction
for (byte i=7;i>=0; i--){
   recu = ta_fonction_qui_recoit_un bit();
   valeur = valeur  | (recu & 1) << i; // le & 1 c'est par sécurité si la condition notée plus haut est respectée c'est inutile
}

Maintenant il y a aussi une soution simplissime:
Tu utilises RX et TX
TX pilote ta source lumineuse
RX est connecté à un récepteur optique (phototransistor ou photodiode+ampli)

Du coup tu peux utiliser directement la librairie Serial.

Re !
J'ai essayé tes scripts mais je dois mal m'y prendre puisque ça ne retourne pas ce que je voudrais... N'y a-t-il vraiment pas un moyen de faire ceci avec des String ? Mon projet est presque bouclé et j'ai utilisé des String dans tout mon programme. J'effectue diverses opérations dessus (mesure de la taille, découpage, recollage...) et je ne sais pas si c'est si simple avec un autre type de variable.

math33:
Re !
J'ai essayé tes scripts mais je dois mal m'y prendre puisque ça ne retourne pas ce que je voudrais... N'y a-t-il vraiment pas un moyen de faire ceci avec des String ? Mon projet est presque bouclé et j'ai utilisé des String dans tout mon programme. J'effectue diverses opérations dessus (mesure de la taille, découpage, recollage...) et je ne sais pas si c'est si simple avec un autre type de variable.

C'est quoi un string??
c'est un tableau de char alors c'est bien difficile de passer de l'un à l'autre.

C'est String et non string que j'utilise. Ca permet simplement de stocker du texte : String() - Arduino Reference

En cherchant davantage dans la doc j'ai trouvé une partie de ma réponse. On peut utiliser la fonction String(). Par exemple, avec String('a', BIN); j'obtiens 1100001. Il manque le 0 au début par contre, je ne sais pas pourquoi.
En revanche, pour partir du binaire et obtenir un caractère, je ne trouve rien...

math33:
j'obtiens 1100001. Il manque le 0 au début par contre, je ne sais pas pourquoi.

Parce que la fonction String n'affiche pas les zéros non significatifs.
En binaire "00000001" et "1" représente le même nombre.
En décimal tu n'écris jamais 000524 mais 524, en binaire c'est pareil.
.

math33:
C'est String et non string que j'utilise. Ca permet simplement de stocker du texte : String() - Arduino Reference

En cherchant davantage dans la doc j'ai trouvé une partie de ma réponse. On peut utiliser la fonction String(). Par exemple, avec String('a', BIN); j'obtiens 1100001. Il manque le 0 au début par contre, je ne sais pas pourquoi.
En revanche, pour partir du binaire et obtenir un caractère, je ne trouve rien...

Et bien si tu lis le lien que tu donnes :

Pour extraire des caractères, tu vois que l'opérateur [] est utilisable dans la classe String et que tu peux aussi l'utiliser la méthode charAt() pour faire la même chose.
Tu as aussi la méthose toCharArray() qui convertit un objet String en tableau de char. Ou aussi getBytes().

C'est pas les possibilités qui manquent.

Pour ajouter des caractères dans une chaine tu as +, concat(), setCharAt,....

En même temps utiliser String si on a pas vraiment besoin c'est un peu se tirer une balle dans le pied car elle est assez gourmande en mémoire.