[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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#1

Message par camil »

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 13:14, modifié 3 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#2

Message par Tlem »

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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#3

Message par camil »

Merci beaucoup ça répond a mon problème.
bonne soirée.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#4

Message par orax »

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 15: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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#5

Message par camil »

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 : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#6

Message par orax »

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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#7

Message par camil »

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 14:14, modifié 3 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#8

Message par Tlem »

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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#9

Message par camil »

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 : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#10

Message par Tlem »

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 : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#11

Message par orax »

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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#12

Message par camil »

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 19:46, modifié 6 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#13

Message par Tlem »

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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#14

Message par camil »

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 : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#15

Message par Tlem »

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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#16

Message par camil »

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 : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

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

#17

Message par orax »

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 : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#18

Message par Tlem »

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é".
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : En ligne

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

#19

Message par jchd »

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 : 63
Enregistré le : mar. 13 oct. 2009 21:41
Status : Hors ligne

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

#20

Message par camil »

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 sam. 07 avr. 2018 00:50, modifié 2 fois.
Répondre