PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV (earlier versions) → Convertire une chaine de caractere en binaire
Convertire une chaine de caractere en binaire
Started by Fred2355, Mar., 04 2018 12:20 AM - 23 replies
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 04 2018 - 12:20 AM
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
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 04 2018 - 9:45 PM
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 modified, March, 04 2018 - 9:47 PM
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 04 2018 - 10:30 PM
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.
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 05 2018 - 12:22 AM
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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 05 2018 - 10:08 AM
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
Posted on March, 05 2018 - 10:41 AM
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
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 05 2018 - 4:35 PM
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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 05 2018 - 5:13 PM
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.?
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 05 2018 - 6:06 PM
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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 05 2018 - 7:13 PM
Exemple, si j'ai un mot qui est ABC, j'aimerais avoir 010000010100001001000011 une fois converti.
Je peux faire comment?
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on March, 05 2018 - 11:16 PM
Bonsoir,

Mais... Quel est le but de cette conversion binaire ?!
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 05 2018 - 11:45 PM
-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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 06 2018 - 8:00 AM
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
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 06 2018 - 10:21 AM
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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 06 2018 - 11:13 AM
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
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 06 2018 - 12:14 PM
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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 06 2018 - 2:01 PM
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
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 06 2018 - 3:14 PM
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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 06 2018 - 4:04 PM
C est bien !
Merci!
Mais quels sont les instructions Windev qui font ça?
Registered member
3,886 messages
Popularité : +227 (347 votes)
Posted on March, 06 2018 - 4:52 PM
// 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
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 07 2018 - 9:55 AM
Bonjour
Merci pour ces codes.
Je suis en train de les tester.
Je te dirais ce qu'il en est asap.
Merci.
Registered member
231 messages
Popularité : +7 (7 votes)
Posted on March, 21 2018 - 8:43 PM
Bonsoir,
Malgré tout mes essais, les codes que tu m'as proposé ne fonctoinne pas.
dommage.
Registered member
25 messages
Posted on September, 30 2022 - 2:02 AM
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 modified, September, 30 2022 - 2:19 AM
Registered member
25 messages
Posted on October, 02 2022 - 7:38 PM
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 modified, October, 02 2022 - 8:18 PM