[R]Récupérer une chaîne délimitée

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

[R]Récupérer une chaîne délimitée

#1

Message par camil » sam. 31 mars 2018 19:59

Bonjour,

Je souhaiterai récupéré une chaîne délimitée en les 2 valeurs FC et 0A, mais il me manque quelque chose dans ma syntaxe car je ne veux pas le FC et 0A dans le récupération de ma variable.
$chaine = "0x000000FCDEBUT***************FIN0A2000C3"
$resul = StringRegExpReplace($chaine, "(?i).+FC(.+0A).+", "\1")
MsgBox(0, "", $resul)
Merci d'avance pour l'aide...
Modifié en dernier par camil le lun. 02 avr. 2018 12:14, modifié 3 fois.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11303
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#2

Message par Tlem » sam. 31 mars 2018 20:24

Bonsoir. Il y a probablement mieux, mais ceci fonctionne :

Code : Tout sélectionner

$chaine = "0x000000FCDEBUT***************FIN0A2000C3"
$resul = StringRegExp($chaine, "(?i)(FC)(.*)(0A)", 1)
MsgBox(0, "", $resul[1])
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#3

Message par camil » sam. 31 mars 2018 20:38

Merci beaucoup ça répond a mon problème.
bonne soirée.

Avatar du membre
orax
Modérateur
Modérateur
Messages : 1454
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Contact :
Status : Hors ligne

Re: [R]Récupérer une chaîne délimitée

#4

Message par orax » sam. 31 mars 2018 22:04

Code : Tout sélectionner

$resul = StringRegExpReplace($chaine, "(?i).*FC(.+)0A.*", "\1")
C'était presque bon avec StringRegExpReplace. Il suffisait juste de déplacer une parenthèse.
Modifié en dernier par orax le dim. 01 avr. 2018 14:46, modifié 1 fois.
Raison : Remplacement de .+ par .*
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#5

Message par camil » dim. 01 avr. 2018 11:56

Bonjour,

Je galère encore, ma chaîne se pressente toujours dans la même organisation .
Je souhaiterai récupérer TEST 1 entre FF et 0A mais il y a une série de 6 fois FF qui sont placées avant et bizarrement je récupère les valeurs après aussi. Pour TEST 2 pas de problème.
#include <String.au3>

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A424144424144"

$test1 = StringRegExp($chaine, "(?i)(FF)(.*)(0A)", 1)
$test2 = StringRegExp($chaine, "(?i)(FC)(.*)(0A)", 1)

$testA = $test1[1]
$testB = $test2[1]

$test1 = _HexToString($testA)
$test2 = _HexToString($testB)

MsgBox(0, "", $test1 & @CRLF & @CRLF & $test2)
Merci d'avance pour l'aide...

Avatar du membre
orax
Modérateur
Modérateur
Messages : 1454
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Contact :
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#6

Message par orax » dim. 01 avr. 2018 12:10

Le code de mon message précédent (#4) devrait marcher.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#7

Message par camil » dim. 01 avr. 2018 12:54

Oui et merci, effectivement ça fonctionne, mais il ne s’arrête pas la première valeur 0A qu'il rencontre. Il faut récupérer une chaîne de valeurs qui est entre [FF, 0A] = "TEST 1" et rien d'autre.

#include <String.au3>

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A4241444241440A"

$test1 = StringRegExpReplace($chaine, "(?i).+FF(.+)0A.+", "\1")
$test2 = StringRegExpReplace($chaine, "(?i).+FC(.+)0A.+", "\1")

MsgBox(0, "En HEX", $test1 & @CRLF & @CRLF & $test2)

$test1 = _HexToString($test1)
$test2 = _HexToString($test2)

MsgBox(0, "En ASCII", $test1 & @CRLF & @CRLF & $test2)
Modifié en dernier par camil le dim. 01 avr. 2018 13:14, modifié 3 fois.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11303
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#8

Message par Tlem » dim. 01 avr. 2018 12:59

Bonjour Camil.
Il serait bien d'inventorier toutes les possibilités qui font qu'un code fonctionne ou pas.
Donnez un maximum d'exemples de lignes et faites en sorte que la partie qui doit être récupérée apparaisse facilement à nos yeux (changez la couleur par exemple).

Avec une certaine quantité d'exemple nous arriveraons sans doute à trouver une solution. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#9

Message par camil » dim. 01 avr. 2018 13:16

J'ai refait l'exemple #7 et fait un exemple plus simple. Je dois récupérer la valeur hexadécimal "544553542031" pour avoir la valeur ascii "TEST 1".

#include <String.au3>

$chaine = "FFFFFF44424144FF5445535420310A4241440A4241440A424144"

$hex = StringRegExpReplace($chaine, "(?i).+FF(.+)0A.+", "\1")

$ascii = _HexToString($hex)

MsgBox(0, "Réponse", "HEX : " & $hex & @CRLF & @CRLF & "ASCII : " & $ascii )

Merci,

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11303
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#10

Message par Tlem » dim. 01 avr. 2018 14:30

Comme je vous l'ai dit, idéalement il faudrait analyser un peut plus les cas qui peuvent poser problème !!!

Ceci dit, pour les cas que vous présentez, voici quelque chose qui fonctionne :

Pour le cas [FC, 0A] :

Code : Tout sélectionner

$chaine = "0x000000FCDEBUT***************FIN0A2000C3"
$resul = StringRegExp($chaine, "(?i)(.*FC)(.*)(0A.*)", 1)
MsgBox(0, "", $resul[1]
Pour le cas [FF, 0A] :

Code : Tout sélectionner

$chaine = "FFFFFF44424144FF5445535420310A4241440A4241440A424144"
$resul = StringRegExp($chaine, "(?i)(.*FF)(.*)(0A.*)", 1)
MsgBox(0, "", $resul[1])
Techniquement, le motif de l'expression régulière (?i)(.*FF)(.*)(0A.*) permet de décomposer la chaine traitée en trois groupes comme ceci :
Groupe 1 : (.*FF) = Tous les caractères de gauche, jusqu'au dernier FF trouvé (sous entendu avant le premier 0A grâce au groupe 3)
Groupe 2 : (.*) = Tous ce qui ce trouve entre le groupe 1 et le groupe 2
Groupe 3 : (0A.*) = Le premier 0A trouvé (sous entendu après groupe 1 et 2) + tous les caractères jusqu'a la fin de la chaîne.

Vu que vous travaillez sur des chaines hexadécimale, la gestion de la casse n'est pas nécessaire et comme je suppose que vous vous moquez de récupérer le début et la fin de la chaîne, du coup, vous pouvez simplifier à :

Code : Tout sélectionner

$chaine = "FFFFFF44424144FF5445535420310A4241440A4241440A424144"
$resul = StringRegExp($chaine, ".*FF(.*)0A.*", 1)
MsgBox(0, "", $resul[0])
Ou si vous tenez absolument au StringRegExpReplace :

Code : Tout sélectionner

$resul = StringRegExpReplace($chaine, ".*FF(.*)0A.*", "\1")
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
orax
Modérateur
Modérateur
Messages : 1454
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Contact :
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#11

Message par orax » dim. 01 avr. 2018 14:53

Si je comprends bien, il faut s'arrêter à la première occurrence de 0A. Donc ce n'est pas (.+) mais (.+?).

Code : Tout sélectionner

#include <String.au3>

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A424144424144"

$test1 = StringRegExpReplace($chaine, ".*FF(.+?)0A.*", "\1")
$test2 = StringRegExpReplace($chaine, ".*FC(.+?)0A.*", "\1")

$test1 = _HexToString($test1)
$test2 = _HexToString($test2)

ConsoleWrite($test1 & @CRLF & $test2 & @CRLF) ; affiche "TEST 1 TEST 2"
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#12

Message par camil » dim. 01 avr. 2018 17:11

Merci j'ai avancé dans mes problèmes de syntaxe, mais je flanche sur se problème.
1.Je récupère bien une chaîne entre [FF00544553542031000000424144000A] = recup1
2.Il faut que je récupère dans recup1 une chaîne entre [0054455354203100] = recup2
C'est sur l’étape 2 que sa coince, la récupération entre la première valeur 00 et la valeur 00 suivante de la variable recup1.

#include <String.au3>

$chaine = "FFFF424144FF00544553542031000000424144000A424144"
$recup1 = StringRegExpReplace($chaine, ".*FF(.+?)0A.*", "\1")
$recup2 = StringRegExpReplace($recup1, ".*00(.+?)00.*", "\1")
$recup3 = _HexToString($recup2)
MsgBox(0, "Réponse", $recup1 & @CRLF & @CRLF & $recup2 & @CRLF & @CRLF & $recup3)

Encore merci
Modifié en dernier par camil le dim. 01 avr. 2018 18:46, modifié 6 fois.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11303
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#13

Message par Tlem » dim. 01 avr. 2018 17:43

Un exemple détaillé de ce que vous voulez serait appréciable.
Donnez-nous plus de détails sur ce que vous ne voulez pas garder ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#14

Message par camil » dim. 01 avr. 2018 19:07

Je veux récupérer "544553542031" dans une variable pour ses 2 exemples.

1er cas entre FF00recup0A. (la pas de problème, et encore merci)

"FFFF424144FF005445535420310A424144"

2ème cas entre FF00recup00 des bricoles et 0A. (la je bloque, le bleu j'en veux pas)

"FFFF424144FF00544553542031000000424144000A424144

Je voulais le faire en 2 étapes pour le 2 éme cas :
1ere étape récup en FF et 0A et 2éme étape récup entre 00 et 00.

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11303
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#15

Message par Tlem » dim. 01 avr. 2018 21:15

Désolé, mais le cas N°2 est encore trop flou. Donnez nous des exemples concrets avec une dizaine de lignes réelles différentes (en imaginant le pire qui puisse arriver).
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#16

Message par camil » dim. 01 avr. 2018 21:49

Voila, c'est l'étape 2 qui récupère la mauvaise chaîne.
J'ai recup2 = "424144" alors que je devrai avoir dans recup2 = "544553542031".

#include <String.au3>

$chaine = "FFFF424144FF0054455354203100424144000A424144"

;~ etape 1 : Recuperation de la chaine "005445535420310042414400" dans recup1
$recup1 = StringRegExpReplace($chaine, ".*FF(.+?)0A.*", "\1")

;~ etape 2 :  Recuperation de la chaine "0054455354203100" a partir de recup1 dans recup2
$recup2 = StringRegExpReplace($recup1, ".*00(.+?)00.*", "\1")

;~ etape 3 :  Suppression des valeures "00"  du debut et la fin de recup2
$recup2 = StringRegExpReplace($recup2,"00" , "")

;~ etape 4 :  convertion en ASCII de la chaine dans recup4
$recup3 = _HexToString($recup2)

;~ etape 5 :  Affichage des etapes recup1, recup2 et recup3
MsgBox(0, "Réponse", $recup1 & @CRLF & @CRLF & $recup2 & @CRLF & @CRLF & $recup3)
.

Avatar du membre
orax
Modérateur
Modérateur
Messages : 1454
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Contact :
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#17

Message par orax » dim. 01 avr. 2018 23:19

Code : Tout sélectionner

;~ etape 2 :  Recuperation de la chaine "0054455354203100" a partir de recup1 dans recup2
$recup2 = StringRegExpReplace($recup1, ".*?00(.+?)00.*", "\1")
J'ai ajouté un ?.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)

Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11303
Enregistré le : ven. 20 juil. 2007 20:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#18

Message par Tlem » lun. 02 avr. 2018 00:41

Visiblement, vous n'avez pas compris ce que je vous demandais !
Afin d'être efficace et pour éviter que chacun perde son temps en conjectures et suppositions, il nous faudrait connaitre plus d'éléments.
Les solutions qui ont déjà été données fonctionnent pour le cas que vous nous avez montré, mais demain ou après demain vous allez certainement revenir en nous expliquant que cela ne fonctionne pas pour tel autre cas. Du coup il va falloir chercher une autre solution ... Il serait tellement plus simple de nous donner toutes les informations d'un coup !!!

Merci de répondre aux questions ci-dessous :
  • - Sur combien de chaines devez-vous effectuer ces traitements ?
    - D’où viennent ces chaines ?
    - Comment et d'ou récupérez vous ces chaines ? Un fichier ? Si oui donnez nous un extrait.
    - Est-ce que toutes les chaines [FF,0A] ont la même longueur ?
    - Est-ce que le début des chaines [FF,0A] est toujours identique (FFFF424144FF00) ?
    - Dans les chaines [FF,0A], en quoi consiste vos repères FF et OA ? Est-ce toujours le dernier FF avant le premier 0A ?
    - Est-ce que le FF est toujours suivit de 00 et est-ce que 0A est toujours précédé de 00 ?
    - Dans votre dernier exemple, pourquoi devez-vous prendre 544553542031 et laisser la suite 0042414400 ?
    - Si vous remplacez le texte à récupérer par un autre texte, à quoi ressemblerait la chaîne entière ? Pouvez-vous nous montrer plusieurs exemples de chaîne ?
Toutes ces questions ont leur importance car par exemple, voici ce qui peux être fait par rapport à votre message #5 :

Code : Tout sélectionner

$chaine = "00FFFFFFFFFFFF424144424144FF5445535420310A424144424144FC5445535420320A4241444241440A"
$resul = StringRegExp($chaine, ".*FF(.*)0A.*.*FC(.*)0A.*0A", 1)
MsgBox(0, "En ASCII", _HexToString($resul[0]) & @CRLF & @CRLF & _HexToString($resul[1]))
Ceci évite un tas de traitement inutiles et simplifie le code.
Mais ceci implique des conditions similaires. les points de repères [FF-0A] et [FC-0A*0A] doivent être similaire sur chaque chaîne à traiter. Il ne faut pas que ces caractères ce retrouvent dans les parties à récupérer.
Si toutes vos chaînes sont formatées de la même manière, alors le code ci-dessus fonctionnera dans tous les cas !!!
Si ce n'est pas le cas, merci de nous donner les éléments précédemment demandés.

Sur ce, je m'en vais faire téter les puces dans les bras de Morphée ou peut être téter Morphée sur un tas de puces. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".

jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 1993
Enregistré le : lun. 30 mars 2009 21:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#19

Message par jchd » lun. 02 avr. 2018 01:23

J'ajouterais un autre détail important : si c'est une chaîne hexa, il faut faire la recherche et l'extraction sur des frontières d'octets, c'est-à-dire tout les 2 charactères de la chaîne. J'insère des espaces entre chaque octet pour illustrer la difficulté :

FF FF 42 41 44 FF 00 54 45 53 54 20 31 0A 42 41 44 --> 00 54 45 53 54 20 31 OK

FF FF 42 41 4F F3 A2 31 FF 00 54 45 53 54 20 31 B0 A3 0A 42 41 0A 44 --> 3A 23 1F F0 05 44 55 35 42 03 1B tout faux ! La chaîne à capturer est soulignée, mais ce n'est pas ce qui sort.

Encore pire si le nombre de caractères hexa capturés n'est pas pair, si l'une seule des séquences FF ou 0A est à cheval sur deux octets.
Bien évidemment, gérer ce point correctement ne présente pas de difficulté pour une expression régulière, encore fau-il le spécifier dans le patron (un "pattern" est un algorithme, en fait).
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.

Avatar du membre
camil
Niveau 4
Niveau 4
Messages : 55
Enregistré le : mar. 13 oct. 2009 20:41
Status : Hors ligne

Re: [..]Récupérer une chaîne délimitée

#20

Message par camil » lun. 02 avr. 2018 12:13

Bonjour a tous,

Merci ORAX ça fonctionne dans les 2 cas. :D
Merci TLEM pour tes explications qui me font avancer sur AUTOIT.
JCHD effectivement je récupère une structure HEXADECIMAL de 256 code ASCII et donc si dans la récupération de se bloc il y a une erreur, la conversion sera faussée. Si tel est le cas je réfléchirai à une vérification à la source.
Modifié en dernier par camil le ven. 06 avr. 2018 23:50, modifié 2 fois.

Répondre