PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Convertire une chaine de caractere en binaire
Convertire une chaine de caractere en binaire
Débuté par Fred2355, 04 mar. 2018 00:20 - 23 réponses
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 04 mars 2018 - 00:20
Bonsoir,

Ce sujet semble déjà avoir été traité, mais je ne trouve pas la réponse qui me correponde.

Voici mon questionnement.

J'ai une chaine de caractères de type "12ABC DE3456 FG7890" que je voudrais traduire en valeur binaire sur 8 bits de type "0010010101110...."

Comment faire?

Ensuite après avoir manipulé ces données Binaire, je doit reconstituer une chaine de caractères. Donc passer de "110110110001010...." à "TOTO123AZERTY987"

Et là aussi comment faire?

Merci pour vos commentaires.
Fred
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 04 mars 2018 - 21:45
Bonjour,
As-tu déjà entendu parler du codage ASCII et de l'UNICODE?

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 04 mars 2018 - 21:47
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 04 mars 2018 - 22:30
Oui, bien sure, mais entre ANSI et Unicode, de ce que je sais c'est que A reste A et B reste B.
Et je ne sais pas comment A peut etre converti en binaire.
Exemple, si j'ai un mot qui est ABC, j'aimerais avoir 010000010100001001000011 une fois converti.
Je peux faire comment?

Paracolonialement votre.
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 05 mars 2018 - 00:22
A correspond à 65 donc à 41 en Hexa et 0100 0001 en binaire.
Ta chaine de départ est en Hexa à priori (comme c'est un exemple, on passera sur le fait que G n'est pas valable.) Il faut maintenant savoir si elle est codée en Unicode ou en UTF8. Tu parles de 8 bits, on peut donc sans trop de problème s'orienter vers de l'UTF8.
Si le nombre de caractère est impair, on boure par un "0" à gauche et on extrait les caractères par groupe de 2,
01, 2A, BC, ........ 90. Chaque paire représentant la valeur Hexa d'un caractère.
Il suffit de récupérer ce caractère via la fonction Caract de Windev. Caract(0x01), Caract(0x2A)........, Caract(0x90)

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 05 mars 2018 - 10:08
Merci pour ton commentaire.
La chaîne de caractères à traiter contient toutes les lettres de A à Z et aussi qq caractères spéciaux.
Est ce que ton idée est applicable?
As tu un bout de.code à me proposer?
Merci
Posté le 05 mars 2018 - 10:41
Un petit exemple:

sHexa est une chaîne="FFFF0205"

nNb est un entier sur 8= Val(sHexa,"x")

Trace( EnBinaire(nNb,64)) //Ici on veut 64 bits
// Le résultat donne:
0000000000000000000000000000000001111111111111110000001000000101


PROCÉDURE INTERNE EnBinaire(nValeur est un entier sur 8,nNbBits est un
entier)
//nNbBits = nombre de bits à retourner (8,16,32 ou 64)
sChaineRetournée est une chaîne

POUR c=nNbBits À 1 PAS -1
SI nValeur[c]=1 ALORS
sChaineRetournée+="1"
SINON
sChaineRetournée+="0"
FIN
FIN
RENVOYER sChaineRetournée

FIN


Bon dev,

Eric
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 05 mars 2018 - 16:35
Si la chaîne à traiter contient tous les caractères alphanumériques + des caractères spéciaux, elle est chiffrée.
Sans la clé, tu ne peux "théoriquement" pas retrouver la chaîne d'origine

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 05 mars 2018 - 17:13
Eric: merci mais tes codes ne prennent pas en compte les lettres à partir de G à Z et autres " , ".
Voroltinquo: non la chaine n est ni codée ni chiffrée. Par exemple une chaîne de caractères fournie par un GPS sur son port com contient des chiffres de 0 à 9 et des lettres jusqu a Z.

Au avez vous comme autres idée.?
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 05 mars 2018 - 18:06
Donne un exemple clair :
J'ai telle donnée, je veux obtenir cette donnée

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 05 mars 2018 - 19:13
Exemple, si j'ai un mot qui est ABC, j'aimerais avoir 010000010100001001000011 une fois converti.
Je peux faire comment?
Membre enregistré
281 messages
Popularité : +24 (26 votes)
Posté le 05 mars 2018 - 23:16
Bonsoir,

Mais... Quel est le but de cette conversion binaire ?!
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 05 mars 2018 - 23:45
-Récupérer un caractère
-Récupérer le code ASCII de ce caractère via la fonction Asc
-Convertir la valeur obtenue de décimal en binaire.

On fait ça tant que la chaine initiale n'est pas vide
Astuce Asc("Barbier")=Asc("B")

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 06 mars 2018 - 08:00
Bonjour Damien,

Pour reprendre, j'ai une chaine de caractère qui vient depuis un capteur électronique que je suis en train de développer.
Pour faire simple et par analogie, la chaine obtenue est du type:
"$GPRMC,053740.000,A,2503.6319,N,12136.0099,E,2.69,79.65,100106,,,A*53 " (celle ci est celle des GPS au format NMEA, et contient suffisamment de caractères pour être représentative mais n'est pas celle de mon projet.).

Je dois convertir chacun des caractères d'une chaine aussi fournie en chaine binaire "01.....0010101...." pour remplir un tableau de 0 et de 1 pour traitement annexe.

Quand je prend une ligne de test que je remplis de 0 et de 1, mon application fonctionne. Mais mon probleme est de transformer une chaine telle que celle aussi compliquée que celle d'un GPS en une quantité de caractères en 0 et 1.

Suis je assez clair?
Merci
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 06 mars 2018 - 10:21
Fred2355 a écrit :
Suis je assez clair?

Oui, je comprend mieux.
Tu as en fait une série de données séparées par des virgules, le tout encadré d'une en-tête et d'une clé. Ces données sont soit décimales, soit alphabétiques.
Est-ce bien celà ?

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 06 mars 2018 - 11:13
une série de données
Oui

séparées par des virgules,
Pas spécifiquement. Ça peut être '":;/)


le tout encadré d'une en-tête et d'une clé.
Non


Ces données sont soit décimales, soit alphabétiques.
Oui
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 06 mars 2018 - 12:14
Quelle est la structure exacte, l'as-tu définie, la connais tu?
Je suis en mode



--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 06 mars 2018 - 14:01
Le probleme n'est pas de connaitre la longueur, les marquants, le début, la fin ou le checksum de la chaine de caractère (comprenant des chiffres, des lettres et des caractères spéciaux).
Le probleme est comment convertir la chaine ces caractères en binaire.

Je sais que j'aurais une boucle à faire du type:

Pour i = 1 à taille(machaine)
extraction 1 à 1 des elements de ma chaine
conversion en binaire de l'elements extrait
fin

Mon probleme se situe dans la procédure pour faire la conversion.
Merci pour ta comprehension
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 06 mars 2018 - 15:14
C'est au programme de 3°
Conversion de N vers une base B
Récupérer le reste R de la division de N par B
Soustraire le R à N
Diviser par B
Réitérer l'opération tant que N<B

Le résultat est de la foirme RnRn-1........R3R2R1 (R1 étant le 1° reste, R2 le 2° ....)

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 06 mars 2018 - 16:04
C est bien !
Merci!
Mais quels sont les instructions Windev qui font ça?
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 06 mars 2018 - 16:52
// Résumé : Converti un entier dans une base donnée
// Syntaxe :
//[ <Résultat> = ] DecimalVersBase (<nNombreAConvertir> est entier, <nBase> est entier)
//
// Paramètres :
// nNombreAConvertir (entier) : Nombre à convertir
// nBase (entier) : Base
// Valeur de retour :
// chaîne ANSI : Nombre converti

FONCTION DecimalVersBase(nNombreAConvertir est entier,nBase est entier):chaîne
sResultat est une chaîne
nReste est entier

TANTQUE nNombreAConvertir>=nBase
nReste=Modulo(nNombreAConvertir,nBase)
nNombreAConvertir-=nReste
nNombreAConvertir=nNombreAConvertir/nBase
sResultat=BaseSup9(nReste)+sResultat
FIN
sResultat=BaseSup9(nNombreAConvertir)+sResultat
RENVOYER sResultat


// Résumé : Transforme éventuellement un nombre en lettre compatible avec la base
// Syntaxe :
//[ <Résultat> = ] BaseSup9(nNombre)
//
// Paramètres :
// nReste (entier) : Nombre à transformer n<Base
// Valeur de retour :
// chaîne ANSI : Nombre transformé

FONCTION BaseSup9(nReste est un entier):chaîne
SI nReste<10 ALORS
RENVOYER nReste
SINON
RENVOYER Caract(55+nReste)
FIN


--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 07 mars 2018 - 09:55
Bonjour
Merci pour ces codes.
Je suis en train de les tester.
Je te dirais ce qu'il en est asap.
Merci.
Membre enregistré
231 messages
Popularité : +7 (7 votes)
Posté le 21 mars 2018 - 20:43
Bonsoir,
Malgré tout mes essais, les codes que tu m'as proposé ne fonctoinne pas.
dommage.
Membre enregistré
25 messages
Posté le 30 septembre 2022 - 02:02
Je suis tombé sur ce sujet car je cherchais une solution pour une variable binaire.

Voila ma solution

Procedure tester()
txtACoder est une chaîne = "$GPRMC,053740.000,A,2503.6319,N,12136.0099,E,2.69,79.65,100106,,,A*53 "

Trace (txtEnBinaire(" ")) //le blanc a le code 20 hexa en Ascii soit 00100000 en binaire
Trace (txtEnBinaire("a"))
Trace (txtEnBinaire("b")) // on voit bien que le code binaire de "b" est bien egal à celui de "a" +1
Trace (txtEnBinaire("$GPRMC,053740.0"))
Trace (txtEnBinaire(txtACoder))

PROCEDURE INTERNE txtEnBinaire(txt est une chaîne )
nbCar est un entier = Taille(txt)
txtBin est une chaîne
POUR i = 1 À nbCar
nbAsc est un entier=Asc(txt[i])
//decodage en binaire de chaque caractere qui est sur 1 octet en ascii
POUR j=7 À 0 PAS -1
txtBin += bitDécaleDroite(nbAsc,j) Modulo 2
FIN
FIN
RENVOYER txtBin
FIN


résultat de la trace (je n'ai pas mis le dernier, il est trop long)

00100000
01100001
01100010
001001000100011101010000010100100100110101000011001011000011000000110101001100110011011100110100001100000010111000110000
Message modifié, 30 septembre 2022 - 02:19
Membre enregistré
25 messages
Posté le 02 octobre 2022 - 19:38
Je m'aperçois que je n'ai pas donné la fonction inverse qui convertit un texte binaire en texte

voir ci dessous, testé avec le resultat conversion du texte "$GPRMC,053740.0"

Procedure tester()
txtBin1 est une chaîne = "001001000100011101010000010100100100110101000011001011000011000000110101001100110011011100110100001100000010111000110000"

n est un entier=1
resu est une chaîne
longTxtB est un entier = Taille(txtBin1)
octetb est une chaîne
Val,puiss2 est un entier
TANTQUE n<longTxtb
octetb=Milieu(txtBin1,n,8)
Val = 0
puiss2 =1
POUR j = 0 À 7
SI octetb[8-j] = "1" ALORS Val += puiss2
puiss2 += puiss2
FIN
resu += Caract(Val)
n += 8
FIN
Trace(resu)


je laisse le soin au lecteur de faire les mêmes fonctions pour les chaines UNICODE (sur 2 octets au lieu d'un par caractère
Message modifié, 02 octobre 2022 - 20:18