Remplacement de caractère ds un txt

Remplacement de caractère ds un txt - Divers - Programmation

Marsh Posté le 21-10-2011 à 23:34:14    

Bonjour,  
 
J'ai posté ma question développée içi: http://www.commentcamarche.net/for [...] res-ds-txt
Et içi https://sourceforge.net/projects/no [...] ic/4770773
 
Pour résumer, dans un texte sur une seule longue ligne, j'aimerais rechercher 3 binôme de lettres commençant toujours par le binôme F7.
Convertir les 2 derniers binômes de caractères (des octets en hexadécimal) par leur correspondance selon une fonction simple.
La formule de conversion "littéraire" serait : dupliquer autant de fois le 3ème binôme qu'indiqué par le second binôme.  
 
Le problème principal viens de l'affichage hexadécimale de ces binôme, pas pour le premier qui ne sert que de balise.
 
Exemple: F7-03-00 doit être remplacé par 00-00-00
F7-05-01 doit être remplacé par 01-01-01-01-01 etc
 
La seule exception que je pourrais "voiler" à l'automatisation concerne le F1-01-F1, qui doit restée telle quel. Une simple recherche/remplacement avant d'appliquer le batch suffira.
 
Si je me suis bien expliqué, il y a autant de remplacements possible qu'entre ces deux ensembles: F7-03-00 et F7-FF-FF; soit 65535 possibilités. Vous comprenez la raison de mon appel à l'aide.  
 
Comment dois je procéder? Je ne comprends rien à SED, et je pense que c'est possible avec notepad++ et ses plugins, macros et fonctions de base.
Merci de m'indiquer un champs de recherche ou même la procédure, je vous en serait vraiment reconnaissant.
 
Cordialement,
 
 John

Reply

Marsh Posté le 21-10-2011 à 23:34:14   

Reply

Marsh Posté le 22-10-2011 à 01:24:31    

Bonjour,
 
Perl est vôtre ami pour tout ce qui concerne la manipulation de texte.
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use constant {
  6.  STATE_NULL => 0,
  7.  STATE_MULT => 1,
  8.  STATE_VAL =>  2,
  9. };
  10.  
  11. my $string = "F70F050503F4F7030AF7"; #une chaine de test qui peut être de longueur quelconque
  12. my $mult;
  13. my $state = STATE_NULL;
  14. while ($string =~ /(..)/g) { # on lit 2 caractères par 2 caracteres
  15.  if ($state == STATE_MULT) {
  16.    $mult = $1;
  17.    $state = STATE_VAL;
  18.  }
  19.  elsif ($state == STATE_VAL) {
  20.    print "$1" x hex($mult); #répétition de chaine
  21.    $mult = undef;
  22.    $state = STATE_NULL;
  23.  }
  24.  else { #$state == STATE_NULL
  25.    if ($1 eq "F7" ) {
  26.      $state = STATE_MULT;
  27.    }
  28.    else {
  29.      print $1;
  30.    }
  31.  }
  32. }
  33. # on traite les cas en fin de ligne terminée par F7 ou F7XY:
  34. if ($state == STATE_MULT) {
  35.  print "F7";
  36. }
  37. elsif ($state == STATE_VAL) {
  38.  print "F7$mult";
  39. }


C:\Perl>perl monscript.pl
0505050505050505050505050505050503F40A0A0AF7


F1-01-F1 vu que ça commence pas par F7, il n'y a aucune raison que ce soit modifié.
 
Si c'est le genre de code qui vous convient, il ne reste qu'a ajouter la lecture/écriture dans un fichier (texte, ou binaire, en sortie?)
 
A+,


Message édité par gilou le 22-10-2011 à 01:39:27

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-10-2011 à 02:43:40    

ouâhw
 
Ca déchire. Votre script a visiblement l'air de faire exactement ce que je recherche.
Merci beaucoup.
Je pensais naïvement me contenter de notepad++ et/ou d'un éditeur Hexa, et/ou de la ligne de commande de Windows pour un batch ou deux.
 
Je ne pensais pas aller jusqu'à installer un soft de programmation, je ne suis pas programmeur, je ne connais et ne sait utiliser PEARL. Je vais étudier la question.
Je ne peux malheureusement pas répondre à "votre question entre parenthèse"; ... j'ai peur de ne pas la comprendre  :lol: .
 
 
Je dirais que j'ai un texte (en entrée?) à modifier - en fait une ligne de plus 20000 caractères - tout simplement. Envoyer le résultat dans un autre fichier texte m'est égal. Je copie/colle le résultat dans un fichier binaire justement, mais si je peux l'éditer directement, c'est loin d'être un soucis.
 
Merci encore pour votre réponse rapide et très efficace.
Je pense revenir içi quand des problèmes surviendront (y en a tout le tps ds ce domaine ^^ )
 
Edit: Effectivement, et c'est entièrement de ma faute. J'ai omis de dire que tout comme les F701F7, les F7 précédés d'un 02 devaient aussi être exclu; deux octets identiques consécutifs sont autorisés, quoi que... Je n'en suis pas sûr en fait. Avec votre script, je vais pouvoir savoir (!)
Du reste, tout a fonctionné. J'en suis encore ébahi. Isoler les F702 en remplaçant par des == ou n'importe quel nombre pair de caractère ne me gêne pas du tout. Plus maintenant.
 
MERCI BEAUCOUP Gilou. :jap:


Message édité par Exceteraviking le 22-10-2011 à 03:01:40
Reply

Marsh Posté le 22-10-2011 à 04:33:08    

Citation :

Du reste, tout a fonctionné.


Vous avez remplacé ma ligne test par la votre en copier-coller?
 

Citation :

Edit: Effectivement, et c'est entièrement de ma faute. J'ai omis de dire que tout comme les F701F7, les F7 précédés d'un 02 devaient aussi être exclu; deux octets identiques consécutifs sont autorisés, quoi que... Je n'en suis pas sûr en fait. Avec votre script, je vais pouvoir savoir (!)


C'est pas très clair, ça. Faut il comprendre que les suites F701 et F702 doivent être laissées telle quelles? (car la compression n'est efficace que a partir de F703XX [en fait, elle est encore inutile pour le coeff 03, mais au moins, on n'utilise pas plus d'octets qu'on en a a comprimer])
A+,


Message édité par gilou le 22-10-2011 à 04:38:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-10-2011 à 18:09:59    

Salut,  
 
Oui, je me suis servi de la 11ème ligne. Pas mal de fois d'ailleurs ^^.
 
Et, oui, - j'avoue ne pas être d'une clarté limpide la plus part du temps - Les F701F7 (le seul existant, c'est un moyen pr le programme d'éviter de prendre le F7 pour un byte concaténant) et le F702XX ne doivent pas être modifié.
Dans la mesure où le F702 n'est présent qu'au début du fichier et qu'une seule fois, j'ai pu écarté la soucis. Mais je suis maintenant sûr qu'il n'est pas un byte de compression.
 
Je n'avait pas remarqué que le F703 était resté tel quel. Mais même si la taille reste inchangée, ils doivent être "traduit", ils sont d'ailleurs légion.
Je le faisait manuellement avant votre script qd j'avais à faire à des petits blocs de ce fichier, lors de son étude. Je pourrais continuer à le faire, vous me faite gagner déja énormément de temps.
 
J'en profite pour vous remercier encore.
C'est comme d'avoir droit au jouet classieux dans un Kinder quand la boite a été partagée entre cousins. :D
 
 
Edit:
Dans votre exemple pourtant, (et je me disais aussi que je n'avais rien remarqué) les F703 sont pris en compte.
 

Citation :


    ...
    my $string = "F70F050503F4F7030AF7"; #une chaine de test qui peut être de longueur quelconque
    ...


 

Citation :

C:\Perl>perl monscript.pl
0505050505050505050505050505050503F40A0A0AF7


 
Vous doutiez de l'efficacité de votre code?


Message édité par Exceteraviking le 23-10-2011 à 18:17:01
Reply

Marsh Posté le 23-10-2011 à 18:23:16    

Oui, ils sont traduits, ce que je dis, c'est que F7030A ça prends exactement autant de place que 0A0A0A, c'est donc inefficace comme compression dans ce cas précis.
 

Citation :

Les F701F7 (le seul existant, c'est un moyen pr le programme d'éviter de prendre le F7 pour un byte concaténant) et le F702XX ne doivent pas être modifié.

Je vais modifier le code pour en tenir compte.
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-10-2011 à 18:37:36    

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use constant {
  6.  STATE_NULL => 0,
  7.  STATE_MULT => 1,
  8.  STATE_VAL =>  2,
  9. };
  10.  
  11. my $string = "F70F050503F4F7030AF701F7F702A0"; #une chaine de test qui peut être de longueur quelconque
  12. my $mult;
  13. my $state = STATE_NULL;
  14. while ($string =~ /(..)/g) { # on lit 2 caractères par 2 caracteres
  15.  if ($state == STATE_MULT) {
  16.    $mult = $1;
  17.    $state = STATE_VAL;
  18.  }
  19.  elsif ($state == STATE_VAL) {
  20.    if (($mult eq "01" ) or ($mult eq "02" )) {
  21.      print "F7$mult$1";
  22.    }
  23.    else {
  24.      print "$1" x hex($mult); #répétition de chaine
  25.    }
  26.    $mult = undef;
  27.    $state = STATE_NULL;
  28.  }
  29.  else { #$state == STATE_NULL
  30.    if ($1 eq "F7" ) {
  31.      $state = STATE_MULT;
  32.    }
  33.    else {
  34.      print $1;
  35.    }
  36.  }
  37. }
  38. # on traite les cas en fin de ligne terminée par F7 ou F7XY:
  39. if ($state == STATE_MULT) {
  40.  print "F7";
  41. }
  42. elsif ($state == STATE_VAL) {
  43.  print "F7$mult";
  44. }


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 23-10-2011 à 18:46:05    

Citation :

Les F701F7 (le seul existant, c'est un moyen pr le programme d'éviter de prendre le F7 pour un byte concaténant)

En y repensant, je suis perplexe devant ceci:
Il serait logique, pour le programme d'éviter de prendre le F7 pour un byte concaténant, en considérant ceci comme cohérent avec le reste, et en transformant ce F701F7 en F7 (je vois pas de moyen pour le programme d'écrire un F7 non suivi de 01 sinon.)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-10-2011 à 15:02:13    

Merci pr la mise à jour. J'aurais plus à manoeuvrer au risque d'oublier de remplacer.
 
Effectivement. Peut être que les programmeur ont voulu une logique implacable, bête et méchante.
Ca aurait du rajouter quelques ligne à leur code. Pour économiser un byte, j'pense qu'ils se sont pas pris la tête + que ça.
Ils ont garder la forme générale du F7nnBB pour la paix de leur cerveau et la petitesse du code à tous les coups.  
J'ai pas le code source, et même si je l'avais, j'y pigerais pas grand chose. Mais je pense être dans le vrai. S'il avait fallu rajouter une condition particulière pour le F7 non compressant, il y aurait pu avoir des risques de bug peut être à terme.
Ca doit être une loi en programmation; Plus le code est court, mieux c'est.
J'suis qu'un moddeur, hacker/cheater moi :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed